Mysqli更新抛出调用成员函数bind_param()的错误
嗨,我有一个70/80字段的forms,我需要插入到一个表,所以而不是手动创build一个巨大的插入语句,我首先创build了一个在我的数据库从表格中的input名称这里是我的代码用来创build/修改表格
function createTable($array, $memberMysqli) { foreach ($array as $key => $value) { //echo "<p>Key: ".$key." => Value: ".$value . "</p>"; $query = "ALTER TABLE questionnaire ADD ".$key." text"; if($stmt = $memberMysqli->prepare($query)) { $success = $stmt->execute(); } } echo "<h1>Array count: ". count($array) ."</h1>" ; }
这工作正常,改变了表,我怎么想它。 现在插入表单值来做到这一点,我做一个基本的一个字段插入存储该行的ID,然后有循环所有后更新该行的variables。 这是我的代码:
$stmt = $memberMysqli->prepare("INSERT INTO questionnaire(userid) VALUES (?)"); $stmt->bind_param('s', $_POST['userid']); $stmt->execute(); $rowid = $stmt->insert_id; $stmt->close(); $memberMysqli->autocommit(FALSE); function updateColumn($memberMysqli, $query, $uid, $value) { if ($value) { $stmt = $memberMysqli->prepare($query); //Throws bind param error here $stmt->bind_param("ss", $value, $uid); $stmt->execute(); } } function loopInputs($array, $memberMysqli, $rowid) { foreach ($array as $key => $formvalue) { var_dump($key); updateColumn($memberMysqli, "UPDATE questionnaire SET $key = ? WHERE id = ?", $rowid, $formvalue); } } loopInputs($_POST, $memberMysqli, $rowid); $memberMysqli->commit(); $memberMysqli->close();
这引发了一个绑定参数的错误,我不知道为什么。 任何帮助将是伟大的。
哦,让我们试试一个规范的答案。
Call to a member function
(或者expects parameter 1 to be mysqli_result, boolean given
的过程风格)不是一个错误本身,而只是一个症状 ,对于其他一些问题。
这个错误消息意味着没有对象被创build在哪里应该。
所以 – 创build$stmt
对象时出现问题。
这很可能是查询的问题。 所以,我们需要跟踪这个错误。
除非明确询问,Mysqli不会告诉你发生了什么事情。 所以,你必须经常检查每个与服务器交互的mysqli函数的结果,如果结果是FALSE – 检查$mysqli->error
。
将mysqli错误消息转换为PHP错误也是非常重要的,让它根据站点范围的错误报告设置。
如果您在整个应用程序代码中使用mysqli_query()而不将其封装到某个帮助程序类中,那么trigger_error()
是引发PHP错误的好方法,因为它会告诉您发生错误的文件和行号
所以,你所有的prepare()
,execute()和query()
调用都必须这样写:
$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]");
或程序风格
$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");
在你所有的脚本中
从那以后你会被告知原因,为什么没有创build对象。 (如果你对这个or
语法感兴趣, 我已经在这里解释了 )注意查询也包含在错误信息中,让你直观地检查它并在另一个环境中testing。
但是 ,如果将查询封装到某个类中,则来自触发器错误的文件和行将是无用的,因为它们将指向调用本身,而不是导致某些问题的应用程序代码。 所以,在运行mysqli命令封装时,必须使用另一种方式:
$result = $mysqli->query($sql); if (!$result) { throw new Exception($mysqli->error." [$query]"); }
作为例外将为您提供一个堆栈跟踪 ,这将导致你的地方从一个错误的查询被称为。
请注意,您必须能够看到一般的PHP错误。 在现场,你必须查看错误日志,所以设置必须是
error_reporting(E_ALL); ini_set('display_errors',0); ini_set('log_errors',1);
而在本地开发服务器上则可以在屏幕上显示错误:
error_reporting(E_ALL); ini_set('display_errors',1);
当然你也不应该在你的语句前面使用错误抑制操作符(@)。