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!

Author: ROMANIA_engineer, 2013-09-06

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']);

Оба способа имеют свои преимущества и недостатки. Лично я предпочитаю связывать имена параметров, так как мне легче читать.

 87
Author: Novocaine, 2018-09-25 08:06:05

Я только что переписал код следующим образом:

    $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
Author: Bob Desaunois, 2013-09-06 10:58: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;
  }
 -2
Author: rohitcopyright, 2013-09-06 10:45:58

Благодаря ответу 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

Когда я "исправляю" проблему, она работает так, как должна. Большое всем спасибо!

 -3
Author: Bob Desaunois, 2016-06-08 10:43:40