-1
<?php
$sTable = "mytable";    

$colUpdate = $_GET['field'];// database field name
$valUpdate = $_GET['val']; // the long string ,can be non-English   
$rowID = $_GET['id']; //number

    $pdo = PDO2::getInstance();
    $pdo->exec('SET NAMES utf8'); // for utf-8

    $sql = "UPDATE $sTable
            SET $colUpdate =:valUpdate
            WHERE id =:rowID ";      
    $req = $pdo->prepare($sql);
    $req->bindValue(":valUpdate",  $valUpdate);
    $req->bindValue(":rowID",  $rowID);

    $req->execute();
    $req->closeCursor();        
   ?>

私はここで何を間違えましたか?

 <?php
    $sTable = "mytable";
    $pdo = PDO2::getInstance();
    $colUpdate = $_GET['field'];
    $valUpdate = $_GET['val'];      
    $rowID = $_GET['id'];

    $sQuery = " UPDATE $sTable SET  $colUpdate = '$valUpdate' WHERE  id = $rowID";
    $req = $pdo->prepare($sQuery);
    $req->execute();
    $req->closeCursor();    
?>
4

1 に答える 1

3

コードにはいくつかの問題があります。

  1. シングルトンを使用しています
  2. エラーをチェックしていません
  3. GET 変数を直接渡しています。

それぞれに対処しましょう。

1. シングルトンを使用している

シングルトンは悪であり、グローバル空間に設定されているため、アプリケーションが不安定になり、信頼性が低く、テストできなくなります。さらに、別のデータベース接続が必要な場合はどうしますか?

解決

新しい PDO インスタンスを使用します。

2. エラーをチェックしていない

コードにはエラー チェックがないため、エラーが発生した場合は黙って無視されます。

解決

PDO のコンストラクターで に設定PDO::ATTR_ERRMODEするか、 を使用します。への設定にも役立ちます。PDO::ERRMODE_EXCEPTIONsetAttributePDO::EMULATE_PREPARESfalse

3. GET 変数をクエリに直接渡している

ステートメントを準備している場合でも、クエリ内で直接渡し$colUpdateています。クエリ文字列に直接渡された変数はエスケープされません。

解決

プレースホルダーで渡し、値をバインドします。また、更新するを決定するためにユーザー入力が必要な場合は、構造に問題がある可能性が高くなります。

これらすべての後、次のコードにたどり着きました。

<?php
/*
 * Variable Initialization
 */
/** @var $table_name string Name of the table to insert */
$table_name = "mytable";

/**
 * @var $field_to_update string Name of field to update
 * @deprecated Should not be used! Database restructuring needed!
 */
$field_to_update = mysql_real_escape_string($_GET['field']); //At least escape it!

/** @var $value_to_insert string */
$value_to_insert = $_GET['val'];

/** @var $row_id integer */
$row_id = $_GET['id'];

$pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->exec('SET NAMES utf8'); // for utf-8

$sql = <<<MySQL
UPDATE $table_name
    SET $field_to_update = :valUpdate
    WHERE id = :rowID
MySQL;

$req = $pdo->prepare($sql);
$req->bindValue(":valUpdate", $value_to_insert, PDO::PARAM_STR);
$req->bindValue(":rowID", $row_id, PDO::PARAM_INT);

$req->execute();
于 2012-06-20T09:16:16.777 に答える