2012-01-24 4 views
0

私はそれが動作しない、これまでのところ私が持っている配列の値からクエリを構築するためにphp配列からPDO MYSQLクエリを構築しますか?

$itemPlus = $_POST['itemPlus']; 
$query = implode(', ', array_map(function($items) {return $items . ' = ' . $items . '-?';}, $items)); 
// $query = 'hats = hats-?, gloves = gloves-?, scarfs = scarfs-?' 
$params = implode(', ', $userCost); 
// $params = '10, 7, 9' 
$q = $dbc -> prepare("UPDATE items SET " . $query . ", $itemPlus = $itemPlus+1 WHERE id = ?"); 
$q -> execute(array($params, $account['id'])); 

をしようとしています、これはこれをしようと私の最初の時間であり、それは動作しないように私は明らかにしています何か間違っている!?

おかげ

+2

「動作しません」と定義してください – Mike

+1

あなたのコードはSQLインジェクションに対して脆弱です。 '$ _POST'変数(または他のユーザ入力)をクエリに直接使わないでください。 – FtDRbwLXw6

+0

この記事を読んでください:http://www.ibm.com/developerworks/library/os-debug/ – webbiedave

答えて

2

$paramsは、値の文字列であるので、あなたは$account['id']と一緒に配列にそれをすることはできません。 $userCostそれを作成した配列Instead.use:$itemPlus$_POSTから来ているので

// Start with the $userCost array... 
$paramArr = $userCost; 
// Add $account['id'] to it 
$paramArr[] = $account['id']; 
// And pass that whole array to execute() 
$q -> execute($paramArr); 

、あなたはそれが有効な入力であることを確認する必要があります。それがそのためにホワイトリストを使用することが推奨され、列名を指しているので:

// Check against an array of possible column names: 
if (!in_array($_POST['itemPlus'], array('col1','col2','col3','col4',...)) { 
    // $_POST['itemPlus'] is NOT VALID 
    // Don't proceed... 
} 
+0

マイケルありがとう、私は今なぜそれがうまくいかなかったのか分かり、今はあなたに感謝しています。 – cgwebprojects

+0

@cgwebprojects可能な列の値のホワイトリストを使って 'itemPlus'の検証について追加した部分も見てください... –

+0

thr列が見つからない場合はクエリが失敗しますか? – cgwebprojects

1

あなたの問題(その1)ここにある:

$q -> execute(array($params, $account['id'])); 

$params変数は、カンマで区切られています文字列:

// $params = '10, 7, 9' 

あなたはこのように、​​方法にparamsパラメータと値の連想配列を渡したい:

$params = array(
    'hats-?' => 10, 
    'gloves-?' => 7, 
    'scarves-?' => 9 
); 

// ... 

$q->execute($params); 
関連する問題