【问题标题】:mySQLi_affected_rows check not working, or is it...?mySQLi_affected_rows 检查不起作用,还是...?
【发布时间】:2013-03-21 18:33:55
【问题描述】:

(对不起,我真的不知道我在做什么。)

我在 Facebook 上的 iframe 中有这个 Unity 游戏,调用同一目录中的一个 php 文件,这很有效。我想要它做的是更新玩家记录(如果存在),如果不存在则制作一个。

这个脚本运行,但它总是返回一个“不在此处”,当我检查数据库时,它实际上每次都在创建记录,但对于 datetime 字段是相同的。所以我不明白为什么affected_rows 永远不会返回为“1”。

<?php
$db = @new mysqli('••.•••.•••.••', '•••••••••••', '••••••••','•••••••••••');
if ($db->connect_errno) 
{
echo("Connect failed "+mysqli_connect_error());
exit();
}
$inIP = $_POST["ip"];
$playerIP = mysqli_real_escape_string($db, $inIP);

$inUN = $_POST["un"];
$playerUN = mysqli_real_escape_string($db, $inUN);

$query = "UPDATE lobby SET whens=NOW(), wherefores='$playerIP', whys=0 WHERE whos='$playerUN'";
mysqli_query($db, $query);
if (mysqli_affected_rows($db) > 0)
    {
    echo "here";
    }
else
    {
    $query2 = "INSERT INTO lobby (whens,whos,wherefores,whys) values (NOW(),'$playerUN','$playerIP',0)";
    mysqli_query($db, $query2);
    echo "not here";
    }   

if ($db)
    {       
    $db->close();
    }
?>

【问题讨论】:

  • 为什么不用INSERT INTO ... ON DUPLICATE KEY UPDATE ... 代替呢?一个查询而不是(可能)两个?注意:PHP 的连接运算符是.。这是完全错误的:echo ('connect failed' + mysqli_connect_error())。您还假设您的查询有效,并且正在抑制错误。 从不假设成功。
  • 变量区分大小写。请启用 error_reporting 一次。当已经使用 mysqli 时,请考虑准备好的语句。
  • 如果$playerIP$playerip 只是一个错字,您的脚本很容易受到SQL 注入攻击。
  • 任何“为什么”问题的答案都在我的第一行;我不知道我在做什么。这是我的第一款具有多人游戏功能的游戏,我只写过 4 个 php 脚本,即使是 SQL 中最简单的小事,似乎也没有对正确的方法达成共识,尽管有很多意见认为哪种方法更错误.

标签: php mysql mysqli sql-update rows-affected


【解决方案1】:

听起来您和我遇到了同样的问题,尤其是当您通过调试器运行代码时。我已经调查了 Netbeans 和 Xdebug 的问题,这似乎是 MySQLi 扩展本身的一个错误。已制作了相应的bug report。同时,您可以改用其他表达式,例如:

if (mysqli_sqlstate($dbc) == 00000) {
   //your code
}

继续调试剩余的代码。

【讨论】:

    【解决方案2】:

    你有一个错字:

    wherefores=$playerip
    

    应该是

    wherefores=$playerIP
    

    因为这个

    mysqli_affected_rows($db)
    

    返回

    -1
    

    【讨论】:

    • 谢谢,但我在发布问题并修复后看到了;显然这不是问题。
    • mysqli_query($db, $query);改成mysqli_query($db, $query) OR triger_error(mysqli_error($db));看看有什么问题
    • 重复记录错误。我接受了 Marc B 的建议,使用 INSERT INTO ... ON DUPLICATE KEY UPDATE ...(不知道他为什么没有将其作为答案发布),现在的错误是语法错误。
    猜你喜欢
    • 2013-06-26
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多