【问题标题】:mysqli prepare select query with OR operator doesn't workmysqli 使用 OR 运算符准备选择查询不起作用
【发布时间】:2016-04-04 12:02:07
【问题描述】:

我正在用 PHP 创建一个收件箱消息系统,就像 Facebook 的那样。为此,我在 MySQL 数据库中创建了 2 个表,分别称为 conversationinbox_messages

这个概念是当一个用户想要与另一个用户开始对话时,我将一条记录插入到 conversation 表中,其唯一 id 有 4 行:

  • id
  • user_one
  • user_two
  • date

我想做什么:当用户登录时,获取从登录创建的用户名会话,然后使用 mysqli 准备语句和选择查询,检查用户是否在 conversation 表中另一个。如果是这样,请附加在 DIV 中。

我面临的问题是查询字符串,尤其是 OR OPERATOR,似乎不起作用。我想在查询中做的是:如果user_one等于$_SESSION['username']user_two等于相同$_SESSION['username'],所以如果登录用户在表行user_one或行@ 987654336@追加对话ID。

$par1 = $_SESSION['username'];
$par2 = $_SESSION['username'];

//$par1 and $par2 holds the same name

$query = "SELECT id FROM conversation WHERE user_one = ? OR user_two = ?";

if ($stmt = $mysqli->prepare($query)) {

    $stmt->bind_param("ss", $par1, $par2);
    $stmt->execute();
    $stmt->bind_result($id);
    $stmt->fetch();

    if ($stmt->num_rows == 1) {
        echo $id;
    }

    $stmt->free_result();
    $stmt->close();
}

【问题讨论】:

  • 查看以下链接 php.net/manual/en/mysqli.error.phpphp.net/manual/en/function.error-reporting.php 并将其应用于您的代码。
  • 好的,我会这样做,但我想问一下,我的 $query 是否正确,也许我应该写不同的,因为这是我第一次使用 OR 运算符
  • 查询本身看起来没问题(一个可以争论在该表中使用字段 user_one 和 user_two 而不是对与另一个表的关系进行建模,但无论如何....) .你得到的结果是什么?它与你的预期有什么不同?
  • 我没有得到任何结果。我期望的是获取两个用户之间的唯一 ID,然后搜索我的第二个表,其中对话 ID 等于我获得的 ID,并找到两个用户之间的所有消息
  • 从我的查询中我得到以下错误**您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在 '? 附近使用的正确语法。或 user_two = ?** @Fred-ii-

标签: php mysqli prepared-statement or-operator


【解决方案1】:

我找到了解决办法。

而不是:

if ($stmt = $mysqli->prepare($query)) {

    $stmt->bind_param("ss", $par1, $par2);
    $stmt->execute();
    $stmt->bind_result($id);
    $stmt->fetch();

    if ($stmt->num_rows == 1) {
        echo $id;
    }

    $stmt->free_result();
    $stmt->close();


     }

我将其替换为:

if ($stmt = $mysqli->prepare($query)) {

    $stmt->bind_param("ss", $par1, $par2);
    $stmt->execute();
    $stmt->bind_result($id);
    while ( $stmt->fetch() ) {
       echo $id;

     }


    $stmt->free_result();
    $stmt->close();


     }

并且有效!

【讨论】:

  • "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?" - 这不支持你告诉我你更早的错误。
  • 是的,$stmt->num_rows == 1 部分看起来很奇怪,但这并不能解释实际的错误消息。 (我假设您在此期间对查询进行了修改,并且在某一时刻出现了一些 [不相关的] 错误。)
  • 谢谢@Fred-ii-我会搜索更详细的
  • 感谢@VolkerK 的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多