【问题标题】:mysqli why does this happens? [duplicate]mysqli 为什么会这样? [复制]
【发布时间】:2009-04-07 13:25:34
【问题描述】:

我有两个后续的mysqli语句,第二个返回:

致命错误:在...中的非对象上调用成员函数 bind_param()

为什么会这样?这是否意味着我需要打开两个不同的连接? 有什么方法可以避免这种情况(我喜欢将 SQL 连接详细信息保存在一个文件中)?

代码如下:

$db = new mysqli("localhost", "root", "", "database");

$stmt = $db->prepare("UPDATE posts SET vote_".$_POST['vote']." = vote_".$_POST['vote']." + 1 WHERE id=?");
$stmt->bind_param('s', $_POST['id_post']);
$stmt->execute();
$stmt->close();

$stmt = $db->prepare("INSERT INTO votes (kind, users_id, posts_id) VALUES (?, ?, ?)");
$stmt->bind_param('sss',$_POST['vote'],$_POST['id_user'],$_POST['id_post']);
$stmt->execute();
$stmt->close();

【问题讨论】:

  • 我当然希望您正在清理这些帖子输入。
  • 我以为用mysqli就可以完全避免sql注入?
  • 如果使用绑定值/参数,您可以避免 SQL 注入。但是是什么阻止了用户发送其他人的用户 ID?
  • 在那些以 die() 终止的查询之前发生的几项检查
  • @0plus1:重要的是要注意,保护您免受 SQL 注入攻击的不是 MySQLi(它很容易使用 MySQLi,但仍然容易受到攻击!),而是 prepared statements .

标签: php mysqli


【解决方案1】:

检查mysqli::prepare的返回值。如果为 FALSE,您应该使用mysqli::error 获取发生错误的详细信息。

【讨论】:

    【解决方案2】:

    我认为您的 $stmt 变量在您调用 bind_param 时为空。也许你的 $_POST['vote'] 是空的?您可以在绑定命令上的参数之前检查它

    【讨论】:

      【解决方案3】:

      $db->prepare() 可能有问题,请检查$db->error

      【讨论】:

      • 这就是问题所在,我对其中一个字段进行了不同的命名。我为没有检查错误而感到羞耻。我认为这是进行两次连续查询的问题。谢谢!
      猜你喜欢
      • 2019-05-20
      • 2015-12-23
      • 1970-01-01
      • 2020-01-19
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多