PDO с ВСТАВКОЙ В сквозные подготовленные заявления [закрыто]
Во время моего путешествия по джунглям PHP: Объекты данных я столкнулся с проблемой выполнения запросов MySQL с помощью подготовленных операторов.
Соблюдайте следующий код:
$dbhost = "localhost";
$dbname = "pdo";
$dbusername = "root";
$dbpassword = "845625";
$link = new PDO("mysql:host=$dbhost;dbname=$dbname","$dbusername","$dbpassword");
$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
VALUES('Bob','Desaunois','18')");
$statement->execute();
Это я, и я хочу быть в своей базе данных. Однако я продолжаю теряться в... ну.. Я не знаю! Согласно Google, это способ сделать это, хотя моя база данных остается пустой.
Я что-то здесь упускаю? Потому что я застрял уже на добрый час и хотел бы продолжайте изучать PDO!
4 answers
Вы должны использовать его так
<?php
$dbhost = 'localhost';
$dbname = 'pdo';
$dbusername = 'root';
$dbpassword = '845625';
$link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);
$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
VALUES (:fname, :sname, :age)');
$statement->execute([
'fname' => 'Bob',
'sname' => 'Desaunois',
'age' => '18',
]);
Подготовленные инструкции используются для очистки ваших входных данных, и для этого вы можете использовать :foo
без каких-либо одинарных кавычек в SQL для привязки переменных , а затем в функции execute()
вы передаете ассоциативный массив переменных, определенных вами в инструкции SQL.
Вы также можете использовать ?
вместо :foo
, а затем передать массив только значений для ввода таким образом;
$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
VALUES (?, ?, ?)');
$statement->execute(['Bob', 'Desaunois', '18']);
Оба способа имеют свои преимущества и недостатки. Лично я предпочитаю связывать имена параметров, так как мне легче читать.
Я только что переписал код следующим образом:
$dbhost = "localhost";
$dbname = "pdo";
$dbusername = "root";
$dbpassword = "845625";
$link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
VALUES(?,?,?)");
$statement->execute(array("Bob","Desaunois",18));
И, похоже, сейчас это работает. но. если я намеренно вызываю ошибку, это не говорит о том, что она есть. Код работает, но все же; если я столкнусь с большим количеством ошибок, я не буду знать, почему.
Пожалуйста, добавьте try catch также в свой код, чтобы вы могли быть уверены, что нет никаких исключений.
try {
$hostname = "servername";
$dbname = "dbname";
$username = "username";
$pw = "password";
$pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw");
} catch (PDOException $e) {
echo "Failed to get DB handle: " . $e->getMessage() . "\n";
exit;
}
Благодаря ответу Novocaine88 на использование цикла try catch я успешно получил сообщение об ошибке, когда вызвал его.
<?php
$dbhost = "localhost";
$dbname = "pdo";
$dbusername = "root";
$dbpassword = "845625";
$link = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);
$link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$statement = $link->prepare("INERT INTO testtable(name, lastname, age)
VALUES(?,?,?)");
$statement->execute(array("Bob","Desaunois",18));
} catch(PDOException $e) {
echo $e->getMessage();
}
?>
В следующем коде вместо ВСТАВКИ В него написано ИНЕРТНЫЙ.
Это ошибка, которую я получил.
SQLSTATE[42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на наличие правильного синтаксиса для использования рядом с "ИНЕРТНЫМ В тестируемой таблице (имя, фамилия, возраст) ЗНАЧЕНИЯ ("Боб", "Десауной" в строке 1
Когда я "исправляю" проблему, она работает так, как должна. Большое всем спасибо!