2016-08-01 4 views
-3

я использовал следующий код для того, чтобы заполнить базу данных с помощью PDO:PDO подготовка не заменяет заполнители

$stmt = $pdo->prepare(" 
    INSERT INTO :season 
    VALUES 
    (
     :tag,:rank, //and so on 
    );    
"); 

for($l = 0; $l < count($data); $l++) { 
    $stmt->execute([ 
     'season' => $tables[$i], 
     'tag' => $data[$l]["tag"], 
     'rank' => $data[$l]["rank"], 
     // and so on 
    ]); 
} 

Но ответ я получаю:

Синтаксическая ошибка или нарушение прав доступа : 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с '? ЗНАЧЕНИЯ «в строке 1' в Е (,,,,,,,,??????): \ XAMPP \ HTDOCS \ CoC_API \ Legenden \ SQL_Test \ API_SQL.php

ли кто-то знаете, где ошибка?

Должен ли я помещать каждую запись в кавычки?

+2

Вам обычно не разрешается вводить имя таблицы в качестве параметра. –

+0

И дополнительно к TiesonT. именам параметров в вызове execute() должен предшествовать старший двоеточие. – user5329483

+0

Наконечник Тьесона зафиксировал его. Но есть ли другой способ сделать динамическое имя таблицы. Имя таблицы - это числовой идентификатор, и его не нужно экранировать. –

ответ

1

Вы неверно связываете значения. Вы должны использовать это имя с :, как в подготовленном запросе. Вы можете увидеть некоторые примеры в документации execute метода http://php.net/manual/en/pdostatement.execute.php

Заменить эту часть вашего кода

for($l = 0; $l < count($data); $l++) { 
    $stmt->execute([ 
     'season' => $tables[$i], 
     'tag' => $data[$l]["tag"], 
     'rank' => $data[$l]["rank"], 
     // and so on 
    ]); 
} 

с этим

for($l = 0; $l < count($data); $l++) { 
    $stmt->execute([ 
     ':season' => $tables[$i], 
     ':tag' => $data[$l]["tag"], 
     ':rank' => $data[$l]["rank"], 
     // and so on 
    ]); 
} 

Вы также можете использовать метод bindValue как в этом случае

for($l = 0; $l < count($data); $l++) { 
    $stmt->bindValue(':season', $tables[$i]); 
    $stmt->bindValue(':tag', $data[$l]["tag"]); 
    $stmt->bindValue(':rank', $data[$l]["rank"]); 
    //and so on 
} 

$stmt->execute(); 
Смежные вопросы