为了账号安全,请及时绑定邮箱和手机立即绑定

Mysqli更新抛出对成员函数BIND_Param()错误的调用

Mysqli更新抛出对成员函数BIND_Param()错误的调用

PHP
12345678_0001 2019-06-29 11:10:31
Mysqli更新抛出对成员函数BIND_Param()错误的调用嗨,我有一个70/80的字段表单,我需要插入到一个表中,所以不是手动创建一个巨大的INSERT语句,而是首先根据表单中输入的名称在我的db中创建了一个表,这里是我用来创建/修改表的代码。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,然后循环所有POST变量,更新该行。这是我的代码:$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();这会引发绑定参数错误,我不知道原因。任何帮助都会很好。
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

不让我们试试标准答案。

Call to a member function(或expects parameter 1 to be mysqli_result, boolean given(对于过程样式而言)本身并不是一个错误,而只是一个症状其他问题。
这一错误消息意味着没有创建应该在哪里创建的对象。

所以-创建一个$stmt对象。
这很可能是查询的问题。所以,我们需要追踪这个错误。

除非明确询问,否则Mysqli不会告诉您发生了什么。因此,您必须始终检查与服务器交互的mysqli函数的结果,如果结果为false,则检查$mysqli->error.

将mysqli错误消息转换为PHP错误信息,让它按照站点范围的错误报告设置进行,也是非常重要的。

如果您在整个应用程序代码中都使用mysqli_query(),而不将其封装到某个助手类中,trigger_error()是引发PHP错误的好方法,因为它还会告诉您发生错误的文件和行号

所以,你所有的prepare(),执行()和query()必须用这种方式写电话:

$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]");

或以程序方式

$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");

在你所有的剧本里
从那时起,您将被告知为什么没有创建对象。(如果你对此感到好奇的话or语法,我已经在这里解释过了注意,该查询也包含在错误消息中,可以让您直观地检查它,并在另一个环境中进行测试。

不过,如果您将查询封装到某个类中,那么触发器错误中的文件和行将是非常无用的,因为它们将指向调用本身,而不是导致某些问题的应用程序代码。因此,在封装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);

当然,您不应该在语句前面使用错误抑制操作符(@)。


查看完整回答
反对 回复 2019-06-29
  • 1 回答
  • 0 关注
  • 346 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信