Sqlite Вызов функции-члена bindParam () в логическом - PullRequest
0 голосов
/ 10 мая 2018

Здравствуйте, я пытаюсь с помощью PDO вставить данные в Sqlite, я пробовал много способов, но я всегда получаю следующие ошибки: Вызов функции-члена bindParam () на логическом.

Я также вижу, что bindParam () или bindValue возвращают false, если существует ошибка. Но я не нахожу ошибки.

спасибо заранее

    function insertCostumers(){
    $costumers = 'INSERT IGNORE INTO costumers(first_name,last_name,age)
            VALUES(:first_name,:last_name,:age)';
    $stmt = $this->pdo->prepare($costumers);
    $data = [['firstName' => 'Hans',
            'lastName' => 'Meier',
            'age' => 32],
            ['firstName' => 'Anna',
            'lastName' => 'Mueller',
            'age' => 35],
            ['firstName' => 'Steffi',
            'lastName' => 'Gygax',
            'age' => 67]];

        $stmt->bindParam(
            ':first_name', $firstName,
            ':last_name', $lastName,
            'age', $age);
        foreach ($data as $d) {
             // Set values to bound variables
            $firstName = $d['firstName'];
            $lastName = $d['lastName'];
            $age = $d['age'];
            // Execute statement
            $stmt->execute();
        }
        die('hello');
}


require "SQLiteConnection.php";
require "SQLiteCreateTable.php";

$sqlite = new SQLiteCreateTable((new SQLiteConnection())->connect());
// create new tables
$sqlite->createTables();
$sqlite->insertCostumers();
$tables = $sqlite->getOrderList();
require "index.view.php";

@ SebastianBrosch Это заявление о создании.

public function createTables() {
$commands = ['CREATE TABLE IF NOT EXISTS costumers (
                costumer_id integer PRIMARY KEY,
                first_name text NOT NULL,
                last_name text NOT NULL,
                age integer NOT NULL
              )',
    'CREATE TABLE IF NOT EXISTS orders (
            order_id integer PRIMARY KEY,
            order_nr integer NOT NULL,
            costumer_id integer,
            FOREIGN KEY (costumer_id) REFERENCES costumers (costumer_id) 
            ON DELETE CASCADE ON UPDATE NO ACTION)'];
     // execute the sql commands to create new tables
     foreach ($commands as $command) {
        $this->pdo->exec($command);
     }

}

1 Ответ

0 голосов
/ 10 мая 2018

Переменная $stmt не является объектом PDOStatement. Это логическое значение (в данном случае false).

Ваш INSERT оператор недействителен. Вместо этого попробуйте следующее (отсутствует OR):

$costumers = 'INSERT OR IGNORE INTO costumers(first_name, last_name, age)
        VALUES(:first_name, :last_name, :age)';

Вы можете использовать методы PDO::errorInfo и PDO::errorCode для получения дополнительной информации.

$costumers = 'INSERT OR IGNORE INTO costumers(first_name,last_name,age)
        VALUES(:first_name,:last_name,:age)';
$stmt = $this->pdo->prepare($costumers);

if ($stmt === false) {
     echo $this->pdo->errorCode().': '.$this->pdo->errorInfo();
}

Вы также используете $firstName и $lastName перед init:

function insertCostumers() {
    $costumers = 'INSERT OR IGNORE INTO costumers(first_name, last_name, age)
        VALUES(:first_name, :last_name, :age)';
    $stmt = $this->pdo->prepare($costumers);
    $data = [['firstName' => 'Hans',
        'lastName' => 'Meier',
        'age' => 32],
        ['firstName' => 'Anna',
        'lastName' => 'Mueller',
        'age' => 35],
        ['firstName' => 'Steffi',
        'lastName' => 'Gygax',
        'age' => 67]];

     foreach ($data as $d) {
         $firstName = $d['firstName'];
         $lastName = $d['lastName'];
         $age = $d['age'];

         $stmt->bindParam(':first_name', $firstName, PDO::PARAM_STR);
         $stmt->bindParam(':last_name', $lastName, PDO::PARAM_STR);
         $stmt->bindParam(':age', $age, PDO::PARAM_INT);

        $stmt->execute();
    }
}

Чтобы убедиться, что комбинация first_name и last_name уникальна, вам нужно добавить ограничение UNIQUE к вашей таблице costumers. Используйте следующий оператор CREATE TABLE:

CREATE TABLE IF NOT EXISTS costumers (
    costumer_id INTEGER PRIMARY KEY,
    first_name TEXT NOT NULL,
    last_name TEXT NOT NULL,
    age INTEGER NOT NULL,
    UNIQUE (first_name, last_name)
);

Вы можете увидеть разницу с и без ограничения UNIQUE в следующей демонстрации: http://sqlfiddle.com/#!7/79b1c/1/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...