调用成员函数execute()on

时间:2013-12-24 12:13:25

标签: php mysql arrays prepare

遇到第27行的问题,不太清楚为什么我是PHP / MySQL的新手。 想知道是否有人可以告诉我为什么我会收到错误;

  

“致命错误:在非对象上调用成员函数execute()   第27行的C:\ xampp \ htdocs \ testscripts \ usercreate.php“

在以下代码中:

<?php
$name = $_POST["name"];
$psswrd = $_POST["psswrd"];
$username = "root";
$password = "hidden";
$hostname = "localhost";
$table = "testtable";


// create connection to database
// ...


$db= new mysqli($hostname, $username, $password, $table);

// sanitize the inputs
// ...

// create an MD5 hash of the password
$psswrd = md5($psswrd);

// save the values to the database
$sql = "INSERT INTO accounts (name, psswrd) VALUES (:name, :psswrd)";

$stmt = $db->prepare($sql);

$stmt->execute(array(
    ":name" => $name,
    ":psswrd" => $psswrd
));

3 个答案:

答案 0 :(得分:0)

如果发生错误,

->prepare会返回false。由于$stmt->execute抱怨被调用非对象,因此可以合理地假设查询出错了。

检查$db->error

答案 1 :(得分:0)

试试这个:

$db= new mysqli($hostname, $username, $password, $table);
if ($db->connect_errno) {
    throw new Exception($db->connect_error, $db->connect_errno);
}
$psswrd = md5($psswrd);

// save the values to the database
$sql = "INSERT INTO accounts (name, psswrd) VALUES (:name, :psswrd)";

$stmt = $db->prepare($sql);
if (!$stmt) {
    throw new Exception($db->error);
}
$stmt->execute(array(
    ":name" => $name,
    ":psswrd" => $psswrd
));

显示您的所有异常,以便更好地了解给定错误。

答案 2 :(得分:0)

首先, MySQLi 类采用的第四个参数是数据库名称,而不是表名。

因此,请将$table = 'testtable';更改为以下内容:$dbname = 'dbname';

此外,在您的代码中,您使用的是命名参数(:name and :passwrd)。这不起作用,因为MySQLi不支持命名参数。 PDO(PHP数据对象)支持命名参数。如果您使用PDO类连接到数据库,您的脚本将正常工作!

如果要使用MySQLi类连接到数据库,请执行以下操作:

$name = $_POST['name'];
$psswrd = $_POST['psswrd'];
$username = "root";
$password = "";
$hostname = "localhost";
$dbname = "dbname";


// create connection to database
// ...


$db= new mysqli($hostname, $username, $password, $dbname);

// sanitize the inputs
// ...

// create an MD5 hash of the password
$psswrd = md5($psswrd);

// save the values to the database
$sql = "INSERT INTO `testtable` (id, name) VALUES (?, ?)";

$stmt = $db->prepare($sql);
$stmt->bind_param('ss', $name, $psswrd);

$stmt->execute();

试试吧。使用问号而不是命名参数。

在bind_param()函数中,我将第一个参数写为'ss'。这两个''代表字符串。如果您有整数数据,则可以将{s'替换为'i'

为什么有两个's',这是非常自我解释的。这是因为您将两个变量绑定到SQL查询,它们都是字符串。因此两个''。