2015-12-06 1 views
0

Я получаю следующую ошибку: когда я пытаюсь вставить данные из формы в базу данных, используя php. Может кто-нибудь, пожалуйста, дайте мне знать, почему это так?Почему я получаю сообщение об ошибке с инструкцией по подготовке при попытке вставить в базу данных

Warning: mysqli::query() expects parameter 1 to be string, object given in C:\xampp\htdocs\westend\process.php on line 25 

Catchable fatal error: Object of class mysqli_stmt could not be converted to string in C:\xampp\htdocs\westend\process.php on line 28 

Это мой код

<?php 
session_start(); 
if (isset($_POST['sub'])) { 
$host='localhost'; 
$user='root'; 
$pass=''; 
$db='theatre_booking'; 

$con=mysqli_connect($host,$user,$pass,$db); 

$row= mysqli_real_escape_string($con, $_SESSION['row']); 
$zone= mysqli_real_escape_string($con, $_SESSION['zone']); 
$quantity= mysqli_real_escape_string($con, $_SESSION['qty']); 
$quote= mysqli_real_escape_string($con, $_SESSION['quotation']); 

$sql=$con->prepare("INSERT INTO booking(PerfDate, PerfTime, Name, Email, Zone, RowNumber) 
VALUES (
    '{$_SESSION['date']}', 
    '{$_SESSION['time']}', 
    '{$_SESSION['name']}', 
    '{$_SESSION['email']}', 
    '{$_SESSION['zone']}', 
    '{$_SESSION['row']}')"); 

    if ($con->query($sql) === TRUE) { 
    echo "Booking successful"; 
} else { 
    echo "Error: " . $sql . "<br>" . $con->error; 
    } 

} 


?> 
+1

'$ con> query ($ sql)' должен быть '$ sql-> execute();'. Использование прямого запроса не связано с подготовкой инструкций. Вам просто нужно выполнить его вместо :-) – Qirel

+1

Вы также должны использовать заполнители и связывать переменные, если вы используете подготовленные инструкции, а не вводите значения непосредственно в инструкцию, которую вы готовите ..... иначе в чем смысл использования подготовленные заявления? –

+1

И если вы использовали переменные связывания, вам не нужно использовать 'mysqli_real_escape_string()' либо –

ответ

0

$ con-> подготовить() функция не возвращает строку с SQL, но вернуть mysqli_stmt объект. поэтому, если вы хотите использовать его, вы можете сделать так:

$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?"); 
$stmt->bind_param("date", $_SESSION['date']); 
$stmt->bind_param("date2", $_SESSION['date2']); 
$stmt->bind_param("date3", $_SESSION['date3']); 
//....... 
$stmt->execute(); 

и если вы хотите использовать запрос: $ con-> запрос ($ SQL); то $ sql должна быть строкой sql, которая равна:

$sql = "INSERT INTO booking(PerfDate, PerfTime, Name, Email, Zone, RowNumber) 
VALUES (
    '{$_SESSION['date']}', 
    '{$_SESSION['time']}', 
    '{$_SESSION['name']}', 
    '{$_SESSION['email']}', 
    '{$_SESSION['zone']}', 
    '{$_SESSION['row']}')"; 
+0

Большое спасибо – YasMan

+0

также, за исключением моего регистрационного имени root, правильно ли я защитил свой php от SQL Injection? Я использовал $ sql = "INSERT INTO booking (PerfDate, PerfTime, Name, Email, Zone, RowNumber) метод – YasMan

+0

@ YasMan Взгляните на [Как я могу предотвратить SQL-инъекцию в PHP?] (Http://stackoverflow.com/вопросы/60174/как-кан-я-предотвращать-SQL-инъекции-в-PHP) – Qirel

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