遇到第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
));
答案 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查询,它们都是字符串。因此两个''。