2014-10-25 5 views
-2

Я пытаюсь получить доступ к MySQL через PHP, но я получаю эти сообщения об ошибках.PHP bind_param не работает

Notice: Undefined variable: stmt in /var/www/contact.php on line 60

Fatal error: Call to a member function bind_param() on a non-object in /var/www/contact.php on line 63

Мой код:

<?php 

$servername = "localhost"; 
$username = "test"; 
$password = "test"; 
$dbname = "test"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 

// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

// LINE 60 
if(!$stmt = $conn->prepare("INSERT INTO MyGuests VALUES(?, ?, ?)") || !is_object($stmt)){ 
    die("Error preparing: (" .$conn->errno . ") " . $conn->error); 
} 
//LINE 63 
$stmt->bind_param("sss", $firstname, $lastname, $email) ; 
+0

Сообщения об ошибках помогут вам разобраться в вашей проблеме, они могут быть находчивыми. Что вы пробовали, учитывая ваши сообщения об ошибках? –

+0

W3schools - не лучшее место для изучения. Что вы делали, так это использование обоих методов в попытке заставить все работать, а кавычки вокруг имен столбцов, которые, кстати, не показаны в их учебнике 'INSERT INTO MyGuests (имя, фамилия, адрес электронной почты) '. Всегда обращайтесь к официальным руководствам, когда речь идет об обучении. ** http: //www.php.net/manual/en/mysqli.quickstart.prepared-statements.php** –

+0

Всякий раз, когда вы оказываетесь в поиске фразы «не работает» (и особенно если вы хотите ее использовать четыре раза), остановитесь и выберите что-нибудь более описательное. Здесь, в разделе «Переполнение стека», мы часто говорим, что это наименее полезный отчет о сбоях. Вместо этого скажите, что вы ожидали, что у вас есть, и то, что вы до сих пор делали для расследования. – halfer

ответ

0

Объект является $ conn, поэтому, если вы хотите включить его в оператор if, вы можете, но не обязательно. Предполагается, что таблица MyGuests как столбец id и lastname, fisrtname, столбец электронной почты. Вам нужно указать фактический столбец в SQL: «INSERT INTO MyGuests (имя, фамилия, адрес электронной почты) VALUES (?,?,?)»

Переменная $ stmt еще не определена. Так что вы не можете сказать! $ Stmt, функция не будет работать.Сделайте что-нибудь вроде:

$stmt = ""; 
if(!($stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"))){ 
    die("Error preparing: (" .$conn->errno . ") " . $conn->error); 
} 

$firstname = "John"; 
$lastname = "Doe"; 
$email = "[email protected]"; 

if(!($stmt->bind_param("sss", $firstname, $lastname, $email))){ 
    die("Error in bind_param: (" .$conn->errno . ") " . $conn->error); 
} 


$stmt->execute(); 
+0

Ошибка при подготовке: (1136) Количество столбцов не соответствует количеству значений в строке 1, что дальше? Или тогда я вообще не получаю ошибок, если немного отредактирую, но все равно не работаю. – Molehole

+0

Укажите фактические столбцы, чтобы подсчет совпадал –

+0

Хмм ... Я получил сообщение об ошибке с пятью вопросительными знаками. Странно, потому что я сделал все, как сказал учебник. Я скоро сообщаю, что происходит. – Molehole

0

Первая ошибка

Примечание: Undefined переменной: STMT в /var/www/contact.php на линии 60 Вы должны объявлять переменные перед использованием. Подобно этим переменным:

$ servername = "localhost";

$ username = "test";

$ password = "test";

$ dbname = "test";

определяет STMT переменного

$ STMT = "«;

или удалить его из если заявление

$ STMT = $ conn-> подготовить ("INSERT INTO MyGuests VALUES (?,?,?)")

Это позволит решить ваши ошибки

+0

Решает первую ошибку, а не вторую. или я получаю следующее: Ошибка при подготовке: (1136) Количество столбцов не соответствует количеству значений в строке 1 – Molehole

2

Упростите обнаружение ошибок. Оберните оператор присваивания в круглые скобки. Забудьте is_object(). Попробуй это.

if(!($stmt = $conn->prepare("INSERT INTO MyGuests VALUES(?, ?, ?) ")) { 
    die("Error preparing: (" .$conn->errno . ") " . $conn->error); 
} 

Это обычно лучше в INSERT заявления прописать имена столбцов, как и

INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?) 

Если столбцы таблицы не в точности то, что вы думали, ваши ВСТАВИТЬ не может корректно работать без перечисление столбцов. Это происходит в примере с w3schools. Они определяют таблицу MyGuests с несколькими столбцами, чем вы используете в своем INSERT.

Обнаружение ошибок на bind_param, так же, как при подготовке.

Определите переменные, которые вы используете в bind_param(), прежде чем использовать их. Попробуйте следующее:

$firstname = "John"; 
$lastname = "Doe"; 
$email = "[email protected]"; 

if (!$stmt->bind_param("sss", $firstname, $lastname, $email)) { 
    die("Error in bind_param: (" .$conn->errno . ") " . $conn->error); 
} 
$stmt->execute(); 

w3schools? В самом деле? Друзья не пускают друзей .... и т. Д.

+0

Мне понравилось, что вы спросили и получили следующее: Ошибка при подготовке: (1136) Число столбцов не соответствует количеству значений в строке 1 Также есть что-то не так с w3schools? Что я должен использовать вместо этого. Я нашел его только в Google. – Molehole

+0

Число столбцов действительно не соответствует примеру w3schools. См. Мой отредактированный ответ. Это довольно распространенный опыт, что советы w3schools иногда просто «отключены». Если вы его используете, дважды проверьте свою работу на соответствующих страницах в руководстве по php. Это руководство имеет хорошие примеры для большинства вещей. –