PDO准备不会取代占位符

时间:2016-08-01 17:05:45

标签: php sql 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服务器版本对应的手册,以便在#39;附近使用正确的语法。价值观(?,?,?,?,?,?,?,?,?)&#39;在第1行&#39;在E:\ XAMPP \ htdocs \ CoC_API \ legenden \ SQL_Test \ API_SQL.php

有人知道错误的位置吗?

我必须将每个条目都放在引号中吗?

1 个答案:

答案 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();