2017-11-22 9 views
1

を定義されていませんでした。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(); 
+0

最初に、あなたのコードは[SQLインサーションに対して脆弱です](https://phpdelusions.net/pdo/sql_injection_example) –

+0

あなたは 'bindValue'で1つずつバインドするとどうなりますか?それはその後動作するのだろうか?また '$ sql'のダンプを共有できますか? – apokryfos

+0

と非常に良い質問をいただきありがとうございます、あなたは100%必要なすべての情報を提供することによって答えることができました。私は何とかこれについてあなたに報酬を与えることができたと思う。 –

答えて

0

[OK]を取得しました。 何らかの理由で、php cantはtransportСompanyIdという名前のパラメータをバインドします。同じ問題のパラメータはtransportСompIdtransportСIdtСItransСompIdとなります。

エラーの原因を正確には理解できませんが、列の名前をtransportIdに変更すると完全に機能します。たぶん、誰かがパラメータの名前に特定の制限があるのを知っているのでしょうか?

+0

はい、プレースホルダーの名前はラテンA-zで、Cは –

+0

ではありません。@ YourCommonSense [OK]私はヘキサ・エディタで開きました。私の「C」は「d1」、右は「43」です。くそー!私はタイプミスがないと確信していましたが、私はそれのために準備ができていませんでした。 –

関連する問題