2013-12-24 6 views
0

Имея проблемы с строкой 27, не совсем понимаю, почему, поскольку я очень новичок в PHP/MySQL. Интересно, может ли кто-нибудь сообщить мне, почему я получаю ошибку;вызов функции-члена execute() на

"Fatal error: Call to a member function execute() on a non-object in C:\xampp\htdocs\testscripts\usercreate.php on line 27"

в следующем коде:

<?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

Изолируйте SQL-запрос и убедитесь, что он работает так, как есть, жестко запрограммируйте запрос и убедитесь, что ваш инструмент управления db займет голый оператор sql, такой как «INSERT INTO accounts (name, psswrd) VALUES (« this »,« that »,) ", входит ли это или появляется сообщение об ошибке? – Cups

ответ

0

->prepare возвращает false, если произошла ошибка. Поскольку $stmt->execute жалуется на вызов не-объекта, разумно предположить, что с запросом что-то пошло не так.

Проверить $db->error.

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 
)); 

Показать все ваши исключения для лучшей идеи данной ошибки.

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-запросом, причем оба они являются строками. Отсюда и два.

Смежные вопросы