致命错误:在非对象上调用成员函数bind_param()

时间:2014-04-24 18:09:31

标签: php

我一直收到此错误

  

致命错误:在第46行的H:\ USBWebserver \ root \ GIPSite \ stagetoevoegen.php中的非对象上调用成员函数bind_param()

经过大量研究并尝试了许多可能的解决方案后,它仍然会出错 这是代码

if (isset($_POST['cmdVerstuur']))
        {
            $invoegen=$link->prepare("insert into tblstagebedrijven (Naam,Begeleider, Locatie, Telefoon, E-mail, Opmerking) values(?,?,?,?,?,?)");
            $naam = $_POST['txtNaambedrijf'];
            $begeleider = $_POST['txtBegeleider'];
            $locatie = $_POST['txtLocatie'];
            $telefoon = $_POST['txtTelefoon'];
            $email = $_POST['txtEmail'];
            $opmerking = $_POST['txtOpmerking'];
            $invoegen->bind_param('ssssss', $naam, $begeleider, $locatie, $telefoon, $email, $opmerking);
            $resultaat=$invoegen->execute();

                if($resultaat)
                    echo "Het stagebedrijf is toegevoegd";
                else
                    echo "Er is een fout opgetreden";

            $link->close();

        }

我有一个包含的connection.php文件,其他页面也可以使用它。

2 个答案:

答案 0 :(得分:2)

编辑:我测试了您的代码并且成功了(与我的答案一起)。
请参阅下面的故障排除调试说明。

取出E-mail列周围的反引号,会出现以下与此类似的错误消息,并使用错误报告,例如:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

位于开头<?php标记

下方的顶部
  

致命错误:未捕获的异常&#39; mysqli_sql_exception&#39;带有消息&#39;您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便使用接近&#39; -mail,Opmerking)值(?,?,?,?,?,?)&#39;在第1行&#39;在/home/user/public_html/dbtest1.php:17堆栈跟踪:#0 /home/user/public_html/dbtest1.php(17):mysqli-&gt;准备(&#39;插入到tbl ...&# 39;)在第17行的/home/user/public_html/dbtest1.php中抛出#1 {main}


编辑前的原始答案:

将您的E-mail列值换成反引号或选择其他方式,EmailE_mail

(Naam,Begeleider, Locatie, Telefoon, `E-mail`, Opmerking)

如果使用分隔标识符,则可以使用标点符号,空格,国际字符和SQL保留字。

我引用this answer :(我已经知道)

  

使用连字符的主要原因是大多数引用必须引用字段名称。否则它们看起来就像是MySQL和人类的减法运算符。

使用错误报告会发现错误。

示例:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

错误检查方法(MySQL-PDO)

的MySQL

// connect (create a new MySQLi object) with custom predefined constants
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_TABLE_NAME);

// $mysqli->connect_error is buggy until PHP 5.3.0
if (mysqli_connect_error())
{
    throw new Exception(mysqli_connect_error());
}

$result = $mysqli->query($sql);

if (!$result)
{
    throw new Exception($mysqli->error);
}

while($row = $mysqli->fetch_assoc($result))
{
    // your result handling code (print it)
}

PDO

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

脚注:(故障排除 - 调试)

var_dump($link->error);

之前放置$invoegen->bind_param('ssssss'

a)您也可以尝试这种方法:

$invoegen = $mysqli->prepare("...");

    if( $invoegen !== FALSE ) {
        $invoegen->bind_param(...);
        $invoegen->execute();
    }
  • http://php.net/manual/en/mysqli.prepare.php

    b)检查您的列类型是什么。

    c)在准备电话后立即放置var_dump($invoegen);

    d)检查列名是否有拼写和/或实际存在。

    e)检查您的表单元素是否已命名且没有拼写错误,同时检查字母大小写。 A!=a;表示大写Aa的处理方式不同。例如:name="Animal"而不是name="animal" 这些是两种不同的动物。


我用以测试它的代码: - 所有列都设置为VARCHAR(255)

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

$DB_HOST = "xxx";
$DB_NAME = "xxx";
$DB_PASS = "xxx";
$DB_USER = "xxx";

$link = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($link->connect_errno > 0) {
  die('Connection failed [' . $link->connect_error . ']');
}

    $invoegen=$link->prepare("insert into tblstagebedrijven (Naam,Begeleider, Locatie, Telefoon, `E-mail`, Opmerking) values(?,?,?,?,?,?)");

    /*
    $naam = $_POST['txtNaambedrijf'];
    $begeleider = $_POST['txtBegeleider'];
    $locatie = $_POST['txtLocatie'];
    $telefoon = $_POST['txtTelefoon'];
    $email = $_POST['txtEmail'];
    $opmerking = $_POST['txtOpmerking'];
    */

    $naam = "Fred";
    $begeleider = "txtBegeleider";
    $locatie = "txtLocatie";
    $telefoon = "txtTelefoon";
    $email = "txtEmail";
    $opmerking = "txtOpmerking";

    $invoegen->bind_param('ssssss', $naam, $begeleider, $locatie, $telefoon, $email, $opmerking);
    $resultaat=$invoegen->execute();

        if($resultaat)
            echo "Het stagebedrijf is toegevoegd - OK";
        else
            echo "Er is een fout opgetreden - NOT ok";

    $link->close();

答案 1 :(得分:0)

... n, E-mail, Opmerking) v...
        ^---- seen as a mathematical subtraction operation

你需要引用它:

... n, `E-mail`, Opmerking) v...

另外,如果你的代码中有正确的错误处理,你就会被告知你的准备操作失败并返回一个布尔值false:

$stmt = $link->prepare(...);
if (!$stmt) {
   die($link->errorInfo); // or whatever your DB lib's error reporting method is
}