猿问

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

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();

这会引发绑定参数错误,我不知道原因。任何帮助都会很好。


12345678_0001
浏览 347回答 1
1回答

潇潇雨雨

不让我们试试标准答案。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&nbsp;=&nbsp;$mysqli->prepare($query)&nbsp;or&nbsp;trigger_error($mysqli->error."[$query]");或以程序方式$res&nbsp;=&nbsp;mysqli_query($mysqli,$query)&nbsp;or&nbsp;trigger_error(mysqli_error($mysqli)."[$query]");在你所有的剧本里从那时起,您将被告知为什么没有创建对象。(如果你对此感到好奇的话or语法,我已经在这里解释过了注意,该查询也包含在错误消息中,可以让您直观地检查它,并在另一个环境中进行测试。不过,如果您将查询封装到某个类中,那么触发器错误中的文件和行将是非常无用的,因为它们将指向调用本身,而不是导致某些问题的应用程序代码。因此,在封装mysqli命令时,必须使用另一种方法:$result&nbsp;=&nbsp;$mysqli->query($sql);if&nbsp;(!$result)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception($mysqli->error."&nbsp;[$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);当然,您不应该在语句前面使用错误抑制操作符(@)。
随时随地看视频慕课网APP
我要回答