Mysqli更新抛出调用成员函数bind_param()错误

时间:2013-03-16 08:19:42

标签: php mysqli

嗨我有一个70/80字段表单,我需要插入表中,所以不是手动创建一个巨大的插入语句我首先在我的数据库中创建一个表从这里的表单中的输入的名称是我用来创建/改变表的代码

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 个答案:

答案 0 :(得分:7)

哦,让我们尝试一个规范的答案。

对于其他一些问题,

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语法感到好奇,I've explained it here) 请注意,查询也包含在错误消息中,以便您可以直观地检查它并在另一个环境中进行测试。

然而,如果您将查询封装到某个类中,则触发错误的文件和行将无用,因为它们将指向调用本身,而不是导致某些问题的应用程序代码。因此,当封装运行mysqli命令时,必须使用另一种方法:

$result = $mysqli->query($sql);
if (!$result) {
    throw new Exception($mysqli->error." [$query]");
}

因为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);

当然你永远不应该在你的陈述前使用错误抑制操作符(@)。