【问题标题】:Conditional prepared statement not switching条件准备语句不切换
【发布时间】:2025-12-20 22:15:06
【问题描述】:

我有以下 PHP 代码,用于在给定用户名的用户名字段为空的情况下插入数据,或者在用户名存在时更新数据。目前,插入之前工作正常,但它永远不会切换到更新子句。

然而,现在插入子句无法识别我的测试变量,原因不明。我得到的错误是:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given

Notice: Undefined variable: checkUsername

最近的。

if($cmd=="submitinfo"){

$usernameQuery = "select username from USERS where username = $username";

$xblah = $con->query($usernameQuery);
  while ($row = mysqli_fetch_assoc($xblah))
  {
    $checkUsername = $row['username'];

  }

if ($checkUsername == null) {

$userQuery = "INSERT INTO USERS VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
if ($userInfo = $con->prepare($userQuery)) {
    $userInfo->bind_param("ssssssssssssssssssss", $username, $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $comments);
    $userInfo->execute();
    $userInfo->close();
    echo "true";
} else {
echo "false";
}
print_r($con->error);
}

else if ($checkUsername == $username) {

$userQuery = "UPDATE USERS SET firstname = ?, lastname = ?, flaggedauctions = ?, lastauction = ?, street1 = ?, city1 = ?, postcode1 = ?, street2 = ?, city2 = ?, postcode2 = ?, phone = ?, mobilephone = ?, fax = ?, email = ?, website = ?, bank = ?, banknumber = ?, accoutnumber = ? WHERE username = ?";
if ($userInfo = $con->prepare($userQuery)) {
    $userInfo->bind_param("sssssssssssssssssss", $firstname, $lastname, $flaggedauctions, $lastauction, $street1, $city1, $postcode1, $street2, $city2, $postcode2, $phone, $mobilephone, $fax, $email, $website, $bank, $banknumber, $accountnumber, $username);
    $userInfo->execute();
    $userInfo->close();
    echo "true";
} else {
echo "false";
}
print_r($con->error);
}
}

根据与用户名字段匹配的 $username 的内容,进行更新或插入的首选方法是什么?

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:
    Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given
    

    这是你的错误信息?我认为你的问题是这一行:

    $xblah = $con->query($usernameQuery);
    

    在 $xblah 上执行var_dump。我怀疑你的查询失败了。可能是因为您没有从输入中获取$username。而对于根的爱,一定要逃离它! mysql_real_escape_string() 会做你想做的事。

    【讨论】:

    • 是的。另一个查询是参数化的,为什么不是这个?
    • $xblah 打印出 bool(false) ?
    • @Josh 这意味着您的查询失败。确保您确实输入了 $username。
    • @Kalium v​​ar_dump $username 打印出 15 个字符的字符串,即正确的用户名。我从 GET 获取用户名,输入肯定在那里。
    • 我觉得你没问题。您使用的方法是可以接受的,并且可能与不涉及完整抽象层的情况一样好。
    【解决方案2】:

    如果你使用 MySQL 并且用户名是唯一的,你可以使用这个方便的 SQL:

    INSERT INTO users (?, ?, ...) ON
    DUPLICATE KEY UPDATE firstname=?,
    lastname=?, ...)
    

    有关完整文档,请参阅 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

    【讨论】:

    • 所以我应该用它来代替我目前拥有的条件代码?