PHP - 致命错误:调用成员函数bind_param()

时间:2015-02-02 02:18:58

标签: php mysql

我已经在这个MySQL查询上拉了我的头发。

我们说我有这个:

    $add = "INSERT INTO books (title) VALUES(?)";
    if ($stmt = $mysqli->prepare($add)) {

        $arr = array($title);

        foreach ($arr as $value) {
            echo var_dump($value);
        }

        $stmt->bind_param("s", $title);

使用foreach - > var_dump

string 'Medieval Times (History)' (length=24)
int 1422843281
int 1420844341
string '127.0.0.1' (length=9)
string 'MY_EMAIL@gmail.com' (length=22)
string '' (length=0)
int 1420844805
int 6
int 3
int 1
int 0
int 0
int 1
int 1
int 1
int 1

好吧,当它遇到这一行时就停止了,我收到了这个错误:

Fatal error: Call to a member function bind_param() on a non-object in C:\wamp\www\books\dashboard.php on line 386

使用第386行:$stmt->bind_param ...

所以,我知道我正在导入16个变量......我收到了这个错误。哎呀。

5 个答案:

答案 0 :(得分:5)

TL \ DR

您的查询未能prepare()。你需要弄清楚在哪里,如何以及为什么。查看此答案的最后一个代码块,让我们知道错误是什么。


我将从查询开始。您正在尝试访问MySQL保留字 Source (See #684) 。你需要用这样的反引号来包装它们:

$add = "INSERT INTO books (title, edited, created, ip,".
    " email_to, twitter, last_taken, questions_total, responses, ".
    "show_progress, need_correct, go_back, state, send_stats, ".
    "show_number, imported) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ".
    "?, ?, ?, ?, ?, ?, ?)";

现在,您要在$stmt块中实例化变量if,然后尝试将其绑定到该块之外。你需要改变这个:

if ($stmt = $mysqli->prepare($add)) {
....
}
$stmt->bind_param(....);

对此:

if ($stmt = $mysqli->prepare($add)) {
....
$stmt->bind_param(....);
}

另外,请确保您的查询实际上正确准备:

if ($stmt = $mysqli->prepare($add)) {

    $stmt->bind_param("siisssiiiiiiiiii", $title, $edited, $created, $ip, $email_to, $twitter, $last_taken, $questions_total, $responses, $show_progress, $need_correct, $go_back, $state, $send_stats, $show_number, $importedVal);

    // execute it and all...
} else {
    die("Errormessage: ". $mysqli->error);
}

然后让我们知道会发生什么。

答案 1 :(得分:0)

尝试以下

$stmt->bind_param(array("siisssiiiiiiiiii", $title, $edited, $created, $ip, $email_to, $twitter, $last_taken, $questions_total, $responses, $show_progress, $need_correct, $go_back, $state, $send_stats, $show_number, $importedVal));

答案 2 :(得分:0)

编辑:试试这个

if ($stmt = $mysqli->prepare($add)) {

    $stmt->bind_param($arr);
}
else {
    printf("Errormessage: %s\n", $mysqli->error);
}

http://php.net/manual/en/mysqli-stmt.bind-param.php

答案 3 :(得分:0)

可能有两件事。

  1. $mysqli是否超出范围?换句话说,您是在函数中使用$mysqli但未传递给该函数还是在该函数中未被声明为全局?
  2. 在您的表格中,INT的任何列都不是INT吗?他们中的任何一个都可以是tinyintsmallintmediumint吗?那你的价值太大了。

答案 4 :(得分:0)

由于SQL中的错误,您的预准备语句出现问题。正如你在你的字段名称中有下划线一样,我几乎可以保证问题是prepare在你没有将它们包裹在`标记中时摇摆不定(我忘记了 flicky撇号的实际名称)。因此,你需要;

$add = "INSERT INTO books (title, edited, created, ip,".
  " `email_to`, `twitter`, `last_taken`, `questions_total`, `responses`, ".
  "`show_progress`, `need_correct`, `go_back`, `state`, `send_stats`, ".
  "`show_number`, `imported`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ".
  "?, ?, ?, ?, ?, ?, ?)";

我已经用标记包裹了所有字段,因为这是最佳做法,但实际上它是导致我体验问题的特殊字符。

希望这有帮助。