【发布时间】: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 .