На моем приключении через джунгли 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!
Вы должны использовать его так
<?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"));
Оба пути имеют свои преимущества и недостатки. Я лично предпочитаю связывать имена параметров, так как мне легче читать.
Я только что переписал код на следующее:
$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(); } ?>
В следующем коде вместо INSERT INTO он говорит INERT.
это ошибка, которую я получил.
SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с тестовой таблицей INERT INTO (имя, фамилия, возраст). VALUES («Bob», «Desaunoi» в строке 1
Когда я «исправляю» проблему, она работает так, как должна. Спасибо всем!