0

次の foreach ループを使用して SQL クエリを作成しています。

$sql =  "UPDATE table01 SET ";  
        foreach(array_combine($values, $variables) as $value=>$variable)
        {
        $sql .="$value = $variable,";
        }
        $sql = rtrim($sql,','); 
        $sql .=" WHERE id = '$id'";

$values は更新されるフィールド タイトルの配列 (db の列ヘッダー) であり、$variables はデータを含む変数の配列です。

このようなループによって作成されたクエリの例を次に示します。

UPDATE table01
SET sv_21 = 123, sv_22 = 123, sv_23 = 2011, sv_I8 = 1 sachet every day, sv_I9 = 3
WHERE id = '001'

の SQL は「毎日」を構文として認識し、更新コマンドを壊します。

このデータを に入力するにはどうすればよいですか? 実際には、これらのクエリは通常、はるかに大きく、いくつかの文字列によって構文エラーが発生します。

ご検討いただきありがとうございます

関連する場合、UPDATE の実行に使用している PDO は次のとおりです。

try 
{
$pdo = new PDO('mysql:host=localhost; dbname=tables', $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare($sql);
$stmt->execute();         




# Affected Rows?
  echo $stmt->rowCount(); // 1
}
4

1 に答える 1

1

テキスト データ (数値データではなく) を SQL フィールドに入力するときは常に、引用符で囲む必要があります。例えば:

UPDATE table01
SET sv_21 = 123, sv_22 = 123, sv_23 = 2011, sv_I8 = '1 sachet every day', sv_I9 = 3
WHERE id = '001'

MySQL などの一部のタイプの SQL では、任意のデータを引用符で囲むことができるため、次のように動作するように PHP を更新する必要があります。

$sql =  "UPDATE table01 SET ";  
        foreach(array_combine($values, $variables) as $value=>$variable)
        {
        $sql .="$value = '$variable',"; // output: sv_I8 = '1 sachet every day',
        }
        $sql = rtrim($sql,','); 
        $sql .=" WHERE id = '$id'";

ただし、これを行う前に、これがデータベースを使用する危険な方法であることを知っておく必要があります。ユーザーがデータにアポストロフィ ( ') を挿入した場合、ユーザーはデータベースに独自の SQL コマンドを追加できます。これは SQL インジェクションと呼ばれ、Web サイトがハッキングされる主要な方法の 1 つです。

データベースを更新するより安全な方法は、プレースホルダーを使用して完全な SQL ステートメントを記述し、各プレースホルダーの値を明示的に定義することです。この方法の詳細については、http: //net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/をご覧ください。

于 2012-10-24T03:17:25.420 に答える