首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysqli更新引发对成员函数bind_param()的调用错误

Mysqli更新引发对成员函数bind_param()的调用错误
EN

Stack Overflow用户
提问于 2013-03-16 16:19:42
回答 1查看 6.6K关注 0票数 6

我有一个70/80的字段表单,我需要将它插入到一个表中,而不是手动创建一个庞大的insert语句。我首先根据表单中输入的名称在我的数据库中创建了一个表。下面是我用来创建/修改该表的代码。

代码语言:javascript
复制
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变量。下面是我的代码:

代码语言:javascript
复制
$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();

这抛出了一个绑定参数错误,我不知道为什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-16 16:28:20

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

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()调用都必须这样编写:

代码语言:javascript
复制
$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]");

或者以过程化的风格

代码语言:javascript
复制
$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]");

在你所有的脚本中

从那时起,你将被告知原因,为什么对象没有被创建。(如果您对此or语法很好奇,请参阅I've explained it here)请注意,错误消息中也包含了该查询,以便您可以直观地检查它,并在另一个环境中进行测试。

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

代码语言:javascript
复制
$result = $mysqli->query($sql);
if (!$result) {
    throw new Exception($mysqli->error." [$query]");
}

as Exception将为您提供一个堆栈跟踪,它将引导您找到调用错误查询的位置。

请注意,您必须能够看到总体上的PHP错误。在实时站点上,您必须查看错误日志,因此,设置必须

代码语言:javascript
复制
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

而在本地开发服务器上,在屏幕上出现错误是正常的:

代码语言:javascript
复制
error_reporting(E_ALL);
ini_set('display_errors',1);

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15447133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档