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!

Related of "PDO с INSERT INTO через подготовленные заявления"

Вы должны использовать его так

 <?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

Когда я «исправляю» проблему, она работает так, как должна. Спасибо всем!