6

我有一个 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();

这会引发绑定参数错误,我不知道为什么。

4

1 回答 1

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(), execute() 和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]");
}

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

当然,您永远不应该在语句前使用错误抑制运算符 (@)。

于 2013-03-16T08:28:19.973 回答