0

いくつかのテキストエリアがあり、それぞれに一意の名前が割り当てられています(たとえば、name = "adcode $ ID")。これらの名前を以下のコードに渡そうとすると、動的な部分のために機能しません。

if (isset($_POST['editadapp'])) {  // Edit AD
$newadcode = mysql_real_escape_string($_POST['.adcode$ID.']);
$doedit = "UPDATE ads SET adcode = '".$newadcode."') WHERE ads_ID=$ID" or die(mysql_error());
$updatead = mysql_query($doedit) or die(mysql_error());
    header("Location: " . $_SERVER['PHP_SELF']);

どうすればこれを解決できますか?

4

3 に答える 3

1

文字列の連結を試みているようです。これを正しく行う方法は次のとおりです。

$newadcode = mysql_real_escape_string($_POST['adcode' . $ID]);

次の行は、SQLクエリを含む文字列を作成するだけです。次の行まで実行しないでください。関数呼び出しがないため、or dieは適切ではありません。また、連結と補間(二重引用符で囲まれた文字列内の変数名)を組み合わせると、問題はありませんが、構文の問題を理解するのに役立たない可能性があるため、一貫性を保ちましょう。

$doedit = "UPDATE ads SET adcode = '" . $newadcode . "' WHERE ads_ID = " . $ID;
于 2012-10-06T02:49:27.870 に答える
1

これには非常に多くの間違いがあり、恐ろしいほどです。

まず、

$doedit = "UPDATE ads SET adcode = '".$newadcode."') WHERE ads_ID=$ID" or die(mysql_error());

そのコード スニペットは多くのレベルで間違っています。

  1. SQL構文が間違っています
  2. SQL は、ユーザー入力からの文字列でフォーマットされます (クエリのパラメータ化については、こちらを参照してください)。
  3. または die() はここでは使用しないでください。文字列を作成しています

理想的には、次のようなコードが必要です。

$dbh =  new PDO('connectionstring to connect to your database');
$sql = 'update ads set adcode = ? where ads_id = ?';
$sth = $dbh->prepare($sql);
$sth->execute(array($_POST['adcode' . $ID], $ID));

その他のトピック:

pdoでパラメータ化されたクエリが必要ですか?

pdo で準備されたクエリ

PHP での SQL インジェクションの防止

于 2012-10-06T03:07:30.110 に答える
0

adcode[<?php echo $ID;?>]テキスト領域と隠しフィールドがあるページのように配列を使用する必要がありますname=adID[$ID]。クエリが実行されるページ $adID = $_POST['adID']; $newadcode = mysql_real_escape_string($_POST['adcode']); $N = count($adID); for($i=0;$N<$i;$i++){ $doedit = mysql_query("UPDATE ads SET adcode = '$newadcode[$i]' WHERE ads_ID=$adID[$i];") or die(mysql_error());

于 2012-10-06T03:23:43.310 に答える