3

「ECRNUM」および「PE_REQUIRED」というタイトルの列を含む複数の列を持つテーブル (opendpu) を持つ MySQL データベースがあります。

いくつかの値を指定して、この更新ステートメントをテストしようとしているだけです。次のエラーが表示されます。

Array ( [0] => 42000 [1] => 1064 [2] => SQL 構文に誤りがあります。'DOE WHERE ECRNUM = 1 行目の 81308' )

私の人生では、ここで何が悪いのか理解できません。誰でも助けることができますか?

<?php
  require ('config.php');
 $ecrno = '81308';
 $pe_required = 'JOHN DOE';

while (true) {
try {
    $db = new PDO($dsn, $uname, $pword);
    $db->exec( "SET CHARACTER SET utf8" );
    $db->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC ); 
    $db->setAttribute( PDO::ATTR_PERSISTENT, true );
    break;
}
    catch (Exception $e) {
        $db = null;
        $counter++;
        if ($counter == $limit)
            throw $e;
    }
}

$stmt = $db->prepare("UPDATE opendpu SET PE_REQUIRED = $pe_required WHERE ECRNUM = $ecrno");
$stmt->execute() or die(print_r($stmt->errorInfo(), true));

  ?>

.

4

3 に答える 3

3

準備されたステートメントを使用するための+1 ...しかし(そしてその大きなBUT):

準備済みステートメントを使用しないbind_paramでください。これにより、SQL インジェクションの可能性が広がり、準備済みステートメントの利点が無効になります。

$stmt = $db->prepare("UPDATE opendpu SET PE_REQUIRED=? WHERE ECRNUM=?");
$stmt->bind_param('si', $pe_required, $ecrno);
$stmt->execute() or die(print_r($stmt->errorInfo(), true));
于 2013-11-13T05:38:46.427 に答える
1

次のように構文を変更します [変数を引用符で囲みます]

$stmt = $db->prepare("UPDATE `opendpu` SET PE_REQUIRED = '$pe_required' WHERE ECRNUM = '$ecrno'");
于 2013-11-13T05:37:53.490 に答える