2012-03-09 2 views
4

Я пытаюсь подготовить подготовленные заявления, но приведенный ниже код не работает. Я получаю сообщение об ошибке:Как использовать подготовленные команды mysqli в PHP?

Fatal error: Call to a member function execute() on a non-object in /var/www/prepared.php on line 12

<?php 

    $mysqli = new mysqli("localhost", "root", "root", "test"); 
    if ($mysqli->connect_errno) { 
     echo "Failed to connect to MySQL: " . $mysqli->connect_error; 
    } 

    $stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)"); 

    // insert one row 
    $stmt->execute(array('one',1)); 

    // insert another row with different values 
    $stmt->execute(array('two',1)); 
?> 

Кроме того, мне нужно использовать MySQLi для подготовленных заявлений? Может ли кто-нибудь указать мне на полный пример подготовленных операторов подключения к вставке для выбора с обработкой ошибок?

+4

* «Может ли кто-нибудь указать мне на полный пример подготовленного заявления от подключения к вводу в выборку с обработкой ошибок» * Да. http://php.net/manual/en/mysqli.prepare.php. Обратите внимание на строку * "' mysqli_prepare() 'возвращает объект оператора или' FALSE', если произошла ошибка. * *. – Tomalak

ответ

9

fdsa От mysqli::prepare docs:

The parameter markers must be bound to application variables using mysqli_stmt_bind_param() and/or mysqli_stmt_bind_result() before executing the statement or fetching rows.

bind_param docs.

т.е .:

$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)"); 

// bind parameters. I'm guessing 'string' & 'integer', but read documentation. 
$stmt->bind_param('si','one',1); 

// *now* we can execute 
$stmt->execute(); 
+0

О, и с предложением Томалака сначала проверить, является ли '$ stmt' FALSE (т. Е. Произошла ошибка). –

6

Also do i need to use mysqli for prepared statement. Can any one point me to a complete example on prepared statement from connection to insertion to selection with error handling

Вы также можете использовать PDO, которые я предпочитаю. На самом деле это похоже на то, что вы запутываете PDO и Mysqli в своем примере кода.

$db = new PDO($dsn, $user, $pass); 
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (?,?)"); 
$stmt->execute(array($name1, $age1)); 
$stmt->execute(array($name2, $age2)); 

В отличие от MySQLi вы не должны вызывать отдельную функцию связывания, хотя эта функция доступна, если вы предпочитаете/хотите/должны использовать его.

Еще одна забавная вещь о ПДО называется заполнители, которые могут быть гораздо менее запутанной в сложных запросов:

$db = new PDO($dsn, $user, $pass); 
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (:name,:age)"); 
$stmt->execute(array(':name' => $name1, ':age' => $age1)); 
$stmt->execute(array(':name' => $name2, ':age' => $age2)); 
-7

Попробуйте это, чистые входящие данные. И не забывайте теги php.

function clean($data) 
{ 
    $data = trim(strip_tags(htmlspecialchars($data))); 
    return $data; 
} 

$field1 = isset($_POST['field1']) ? clean($_POST['field1']): NULL; 
$field2 = isset($_POST['field2']) ? clean($_POST['field2']): NULL; 
$field3 = isset($_POST['field3']) ? clean($_POST['field3']): NULL; 
$field4 = isset($_POST['field4']) ? clean($_POST['field4']): NULL; 
$field5 = isset($_POST['field5']) ? clean($_POST['field5']): NULL; 
$field6 = isset($_POST['field6']) ? clean($_POST['field6']): NULL; 
$field7 = isset($_POST['field7']) ? clean($_POST['field7']): NULL; 
$database = new mysqli("localhost", "username", "password", "database"); 
if ($database->errno) die("Error opening database: " . $database->error()); 
$query = 'INSERT INTO `tablename` (`field1`, `field2`, `field3`, `field4`, `field5`, `field6`, `field7`) VALUES (?, ?, ?, ?, ?, ?, ?)'; 
$result = $database->prepare($query); 
$result->bind_param('sssssss', $field1, $field2, $field3, $field4, $field5, $field6, $field7); 
$result->execute(); 
$database->close(); 
{ 
    header("Location: http://www.somewebsite.com"); 
} 
+1

Эта функция не очищает ничего, что не имеет ничего общего с подготовленными операциями mysqli. –

+0

Это проверенный и функционирующий скрипт, можете ли вы потрудиться, чтобы объяснить свои причины для вашего заявления. – steve

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