を定義されていませんでした。PDOエラー:無効なパラメータ番号:パラメータは、私はテーブルを持っている
CREATE TABLE `transportCompanies` (
`transportСompanyId` int(11) NOT NULL AUTO_INCREMENT,
`fullName` varchar(200) NOT NULL,
PRIMARY KEY (`transportСompanyId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
やコード:
$insertData['fields']string(33) "`transportСompanyId`, `fullName`"
$insertData['placeholders']string(31) ":transportСompanyId, :fullName"
$insertData['keyValues']string(86) "`transportСompanyId` = VALUES(`transportСompanyId`), `fullName` = VALUES(`fullName`)"
:この後
// this post data just for test
$_POST['data'] = '{ "transportСompanyId": 1,
"fullName": "USER INPUT HERE" }';
$insertData['array'] = json_decode($_POST['data'], true);
$insertData['fields'] = "";
$insertData['placeholders'] = "";
$insertData['keyValues'] = "";
foreach ($insertData['array'] as $column => $data) {
$insertData['fields'] .= "`{$column}`, ";
$insertData['placeholders'] .= ":{$column}, ";
$insertData['keyValues'] .= "`{$column}` = VALUES(`{$column}`), ";
}
$insertData['fields'] = rtrim($insertData['fields'], ", ");
$insertData['placeholders'] = rtrim($insertData['placeholders'], ", ");
$insertData['keyValues'] = rtrim($insertData['keyValues'], ", ");
我々のような変数を持っていますSQLクエリを実行した後:
$sql = "INSERT INTO `{$tableName}` ({$insertData['fields']})
VALUES ({$insertData['placeholders']})
ON DUPLICATE KEY UPDATE
{$insertData['keyValues']}";
$stmt = $dbh->prepare($sql);
$stmt->execute($insertData['array']);
私はエラーが発生します:
PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in
これで$stmt->debugDumpParams()
出力:
SQL: [232] INSERT INTO `transportCompanies` (`transportСompanyId`, `fullName`)
VALUES (:transportСompanyId, :fullName)
ON DUPLICATE KEY UPDATE
`transportСompanyId` = VALUES(`transportСompanyId`), `fullName` = VALUES(`fullName`)
Params: 2
Key: Name: [20] :transportСompanyId
paramno=-1
name=[20] ":transportСompanyId"
is_param=1
param_type=2
Key: Name: [9] :fullName
paramno=-1
name=[9] ":fullName"
is_param=1
param_type=2
クエリに2つのパラメータがあるので、私は、考えるのかわからない、と私は2つを渡します配列内のパラメータタイプミスはありません。 transportCompanyId
が既に存在する場合、私は行を更新する必要があるので、私はtransportCompanyId
を渡さないと、要求は正常に通るが意味をなさない。
私は何かが不足していると思う、助けてください。ありがとうございました。
[OK]をEDIT、コードのシンプルなバージョンも動作しません。 SQLインジェクションは絶対にゼロですが、同じエラーです。
$sql = "INSERT INTO `transportCompanies` (`transportСompanyId`, `fullName`)
VALUES (:transportСompanyId, :fullName)
ON DUPLICATE KEY UPDATE
`transportСompanyId` = VALUES(`transportСompanyId`), `fullName` = VALUES(`fullName`)";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(":transportСompanyId", 1);
$stmt->bindValue(":fullName", "TEST");
$stmt->execute();
最初に、あなたのコードは[SQLインサーションに対して脆弱です](https://phpdelusions.net/pdo/sql_injection_example) –
あなたは 'bindValue'で1つずつバインドするとどうなりますか?それはその後動作するのだろうか?また '$ sql'のダンプを共有できますか? – apokryfos
と非常に良い質問をいただきありがとうございます、あなたは100%必要なすべての情報を提供することによって答えることができました。私は何とかこれについてあなたに報酬を与えることができたと思う。 –