0

情報の配列を mysql データベースに挿入する際に問題が発生しています。基本的に、jquery のソート機能で div を新しい場所に移動することで配置できる、Facebook のフォト アルバムに似たソート可能なギャラリーを作成しました。

Ajax を使用して、div の新しい順序を DB に挿入する php ファイルを呼び出しています。情報は正しく渡されていますが、正しく挿入されていません。

表示されるエラーは次
のとおりです。SQL 構文にエラーがあります。1行目の「Array」付近で使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

PHPコードは次のとおりです。

foreach ($_GET['listItem'] as $position => $item) {
    if ($item >= 1) {
        $sql[] = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";
        mysql_query($sql) or die(mysql_error());
    }
}

mysql_query 関数を削除して print_r を実行すると、次のようになります。

Array
(
    [0] => UPDATE table SET order = '0' WHERE id = '2'
    [1] => UPDATE table SET order = '1' WHERE id = '4'
    [2] => UPDATE table SET order = '2' WHERE id = '3'
    [3] => UPDATE table SET order = '3' WHERE id = '1'
    [4] => UPDATE table SET order = '4' WHERE id = '5'
    [5] => UPDATE table SET order = '5' WHERE id = '6'
)

このようなことを試みたのはこれが初めてです。どんな助けでも素晴らしいでしょう。

助けてくれてありがとう!

4

2 に答える 2

1

Inmysql_query($sql) $sqlは配列であるため、その値は単にArrayです。割り当てるときは$sql[] = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";、この行を作成するだけです$sql = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";。それはあなたの問題を解決するはずです。

編集:

を残して[]、そのままの場所から を簡単に削除できmysql_queryます。foreach リスト項目の後に、これを追加します。

foreach($sql as $query) {
    mysql_query($query);
}
于 2012-05-18T18:41:01.450 に答える
0

[] 演算子の機能について混乱があるようです。[] は、既存の配列の末尾に要素を追加する場合に使用します。

例えば:

 $sql = array();
 $sql[] = 'UPDATE table SET order = "0" WHERE id = "2"';
 mysql_query($sql); // this will produce the error you are seeing

対:

 $sql = 'UPDATE table SET order = "0" WHERE id = "2"';
 mysql_query($sql); // this will work

コードを次のように書き直す必要があります。

foreach ($_GET['listItem'] as $position => $item) {
  if ($item >= 1) {
    $sql = "UPDATE table SET order = '{$position}' WHERE id = '{$item}'";
    mysql_query($sql) or die(mysql_error());
  }
}

それはあなたが意図していることをします。ただし、信頼できない $_GET データをデータベースに直接渡しているため、これはまだ良い考えではありません。たとえば、次のような文字列でスクリプトを呼び出すことができます。

http://yoursite.com/yourscript.php?listItem=1'%3B%20DROP%20TABLE%20yourtable%3B

の値はlistItemデータベースに直接$item >= 1送信されるため (数値データで始まる場合、PHP は文字列を整数として評価するため、チェックが不十分です)、単一引用符を追加して前のクエリを終了するだけです。 、その後、好きな SQL コマンドを自由に挿入できます。これは基本的な SQL インジェクション攻撃です。データベースに触れるコードを作成するときはいつでも、データベースに送られる可能性のある入力をクレンジングする必要があります。コードの最終バージョンは次のようになります。

foreach ($_GET['listItem'] as $position => $item) {

  if ($item >= 1) { // this check may or may not be needed depending on its purpose

    $sql = 'UPDATE table SET order = "' . mysql_real_escape_string($position) . '" WHERE id = "' . mysql_real_escape_string($item) . '"';
    mysql_query($sql) or die(mysql_error());

  }

}

入力データをクレンジングする方法は他にもありますが、これはその 1 つにすぎません。それが役立つことを願っています。

于 2012-05-18T19:51:21.440 に答える