Подтвердить что ты не робот

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!

4b9b3361

Ответ 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

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