就像往常一样,我正在寻找使用PHP的最佳实践,准备好的语句似乎是我现在应该如何关闭我的眼睛。所以我开始玩我发现的一些例子。
运行脚本时出现此错误:
致命错误:调用成员函数 bindParam()在非对象中 /选择/ LAMPP / htdocs中/ phpSecurity / PreparedStatments /插入的多绑定-PARAMS /插入 第10行的简单Method.php
这就是代码。
插入简单的Method.php
<?php
require_once '../config.php';
$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
$nome = 'Fabio Antunes';
$telefone = 916810641;
$bi = 123093456;
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
$stmt->execute();
$stmt->close();
$db->close();
?>
的config.php
<?php
$server_host = 'localhost';
$server_user = 'root';
$server_password = '';
$server_db = 'PreparedStatements';
$db = new mysqli($server_host, $server_user, $server_password, $server_db);
?>
不确定我在这里做错了什么,这是在php.net上找到的类似例子,为什么不工作? PS:我认为mysqli连接不是问题,因为我用它来用SELECT SQL命令做一些准备好的语句。并且工作得非常好。
修改
决议及其原因。
在example中我应该对查询中的每个值使用bind_param()
。但是感谢Bart,他设法用我的代码解决了这个问题。
它在哪里:
$stmt->bindParam(1, $nome);
$stmt->bindParam(2, $telefone);
$stmt->bindParam(3, $bi);
应该是:
$stmt->bind_param("sii", $nome, $telefone, $bi);
现在对于那些可能想知道什么是“sii”的人。
我看到它的bind_param绑定“$ var”到每个问号“?”按顺序。
因此,使用一个bind_param()
我可以同时绑定它们,并且正常使用bind_param()
需要指定绑定的数据类型。
我要绑定的第一个值是$nome
一个字符串,由“s”指定;
其他$telefone
和$bi
是整数,因为他有“我”;
对于其他有类似问题的人来说,其他数据类型(来自php.net)。
i =整数;
s = String;
d = Double;
b = Blob;
如果有人作为更好的解释,请发布或评论。所以我可以改进自己。
感谢。
答案 0 :(得分:6)
您可能认为连接没有问题,但您应该检查以确保:
$db = new mysqli($server_host, $server_user, $server_password, $server_db);
if (mysqli_connect_errno()) {
printf("DB error: %s", mysqli_connect_error());
exit();
}
编辑:
当你这样做时会发生什么:
$stmt = $db->prepare("INSERT INTO coisas (nome, telefone, bi) VALUES (?, ?, ?)");
$stmt->bind_param("sii", $nome, $telefone, $bi);
$stmt->execute();
表格coisas
拼写正确吗?
答案 1 :(得分:2)
在第4行返回后,在$ stmt上执行print_r。它是真实对象吗?我猜不是。