PHP5很新,但仍有一些问题。我想出了如何选择准备好的语句现在尝试插入/更新我的代码如下
function input_lab_results($name, $image, $descrip) {
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssiidd', $name, $image, $descrip, 0, 0, date("Ymd"), date("Ymd"));
$stmt->execute();
die();
} else{
die($this->conn->error);
}
}
我得到的错误是
致命错误:第43行无法通过引用html / classes / mySQL.php传递参数4
任何帮助/参考将不胜感激。谢谢。
每个人都提到使用PDO,你们有没有任何好的教程或者这样的例子?
答案 0 :(得分:1)
我把它改成了
function input_lab_results($name, $image, $descrip) {
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssdd', $name, $image, $descrip, date("Ymd"), date("Ymd"));
$stmt->execute();
die();
} else{
die($this->conn->error);
}
}
基本上我改变了读它的地方?对于查询中的整数为0,我没有绑定它。
答案 1 :(得分:1)
问题不在于$descrip
;它是0(参数4和5)。解决方案是传递变量而不是整数:
`$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, ?, ?, ?, ?)";`
$pat_doctor = 0;
$pat_resident = 0;
if($stmt = $this->conn->prepare($query)){
$stmt->bind_param('sssiidd', $name, $image, $descrip, $pat_doctor, $pat_resident, date("Ymd"), date("Ymd"));`
显然mysqli_bind_param希望它的参数作为引用,因此它会查找它们存储在内存中的位置,而不是复制它们的值。这是有道理的,因为您想要绑定到sql语句的某些内容(例如该图像)可能足够大,以至于您不希望有多余的副本在运行。不能通过引用访问文字,字符串或其他内容。见:http://us.php.net/references
我不建议将0硬编码到sql语句中,因为它会不必要地混淆你的代码。
顺便提一句,让我建议PDO。它的语法更加清晰。答案 2 :(得分:0)
不要使用bind_param
- 这是一个非常不直观且容易出错的界面,它主要来自底层C-api的遗产。使用bind_value
或更好 - 将一组值作为参数传递给PDOStatement->execute
。例如:
$query = "INSERT INTO pat_table (pat_name, pat_image, pat_descrip, pat_doctor, pat_resident, pat_create, pat_modify) VALUES (?, ?, ?, 0, 0, ?, ?)";
if ($stmt = $this->conn->prepare($query)) {
$stmt->execute(array($name, $image, $descrip, date("Ymd"), date("Ymd")));
die();
} else {
die($this->conn->error);
}