PDO с INSERT INTO через подготовленные заявления
В моем приключении через джунгли 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!
Ответы
Ответ 1
Вы должны использовать его так
<?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(array(
"fname" => "Bob",
"sname" => "Desaunois",
"age" => "18"
));
Подготовленные утверждения используются для дезинфекции вашего ввода, и для этого вы можете использовать :foo
без каких-либо одиночных кавычек в SQL для привязки переменных, а затем в функции execute()
вы передаете ассоциативный массив переменных вы определили в инструкции SQL.
Вы также можете использовать ?
вместо :foo
, а затем передать в массив только значения для ввода так:
$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
VALUES(?, ?, ?)");
$statement->execute(array("Bob", "Desaunois", "18"));
Оба способа имеют свои преимущества и недостатки. Я лично предпочитаю связывать имена параметров, поскольку мне легче читать.
Ответ 2
Я только что переписал код на следующее:
$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));
И теперь это работает.
НО. если я по какой-то причине вызывают ошибку, она не говорит, что она есть.
Код работает, но все же; я должен столкнуться с большим количеством ошибок, я не буду знать, почему.
Ответ 3
Пожалуйста, добавьте 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;
}
Ответ 4
Благодаря ответу 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();
}
?>
В следующем коде вместо INSERT INTO он говорит INERT.
это ошибка, которую я получил.
SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с тестовой таблицей INERT INTO (имя, фамилия, возраст). VALUES ('Bob', 'Desaunoi' в строке 1
Когда я "исправляю" проблему, она работает так, как должна.
Спасибо всем!