Php Mysqli update引发对成员函数bind_param()的调用错误
我有一个70/80字段的表单,我需要将它插入到一个表中,所以我没有手动创建一个巨大的insert语句,而是首先在我的db中根据表单中输入的名称创建了一个表。下面是我用来创建/更改表的代码Php Mysqli update引发对成员函数bind_param()的调用错误,php,mysqli,Php,Mysqli,我有一个70/80字段的表单,我需要将它插入到一个表中,所以我没有手动创建一个巨大的insert语句,而是首先在我的db中根据表单中输入的名称创建了一个表。下面是我用来创建/更改表的代码 function createTable($array, $memberMysqli) { foreach ($array as $key => $value) { //echo "<p>Key: ".$key." => Value: ".$value
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>" ;
}
这会引发绑定参数错误,我不知道为什么。O,让我们尝试一个规范的答案
调用成员函数
(或者希望参数1是mysqli_结果,对于过程样式来说是布尔值)
本身并不是一个错误,而只是一些其他问题的症状。这个错误消息意味着没有在应该创建的位置创建对象 因此-创建
$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]");
在所有脚本中从那时起,您将被告知未创建对象的原因。 (如果您对这种
或语法感到好奇,)
请注意,查询也包含在错误消息中,以便您可以直观地检查它并在另一个环境中进行测试
但是如果您将查询封装到某个类中,则文件和行from trigger error将毫无用处,因为它们将指向调用本身,而不是导致特定问题的应用程序代码。因此,在运行封装的mysqli命令时,必须使用另一种方法:
$result = $mysqli->query($sql);
if (!$result) {
throw new Exception($mysqli->error." [$query]");
}
as Exception将为您提供一个堆栈跟踪,它将引导您找到调用错误查询的位置
请注意,您通常必须能够看到PHP错误。在一个实时站点上,你必须查看错误日志,因此,设置必须是
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
在本地开发服务器上,可以在屏幕上出错:
error_reporting(E_ALL);
ini_set('display_errors',1);
当然,您永远不应该在语句前面使用错误抑制运算符(@) 谢谢!这是一段我应该知道的简便代码。问题是,当我修改表时,它创建了一个字段“submit”,这导致了更新上的问题。
error_reporting(E_ALL);
ini_set('display_errors',1);