Как использовать подготовленные операторы mysqli в PHP? - PullRequest
5 голосов
/ 09 марта 2012

Я пробую подготовленные заявления, но приведенный ниже код не работает.Я получаю ошибку:

Неустранимая ошибка: вызов функции-члена execute () для необъекта в /var/www/prepared.php в строке 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 для подготовленных заявлений?Может кто-нибудь указать мне полный пример подготовленных операторов от подключения к вставке к выбору с обработкой ошибок?

Ответы [ 3 ]

9 голосов
/ 09 марта 2012

fdsa Из mysqli::prepare документов :

Маркеры параметров должны быть привязаны к переменным приложения с использованием mysqli_stmt_bind_param () и / или mysqli_stmt_bind_result () перед выполнением оператора или извлечением строк.

bind_param документы .

т.е:.

$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();
6 голосов
/ 09 марта 2012

Также мне нужно использовать mysqli для подготовленного заявления.Может ли кто-нибудь указать мне полный пример подготовленного оператора от соединения до вставки к выбору с обработкой ошибок

Вы также можете использовать 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, вам не нужно вызывать отдельную функцию привязки, хотя эта функция доступна, если вы предпочитаете / хотите / должныиспользуйте его.

Еще одна забавная вещь в PDO - это заполнители, которые могут быть намного менее запутанными в сложных запросах:

$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));
0 голосов
/ 17 ноября 2013

Попробуйте, очистите входящие данные.И не забывайте теги 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...