2

以前は、スクリプト内の任意のselectクエリに対して1つの関数を使用していましたが、安全ではないため、phpで動的PDOクラスを作成する方法を見つける必要があります。

たとえば、私はこのコードを使用していました。

function excute_query ($Query)
{

    if($Query_Run = mysql_query($Query))
    {
        while($DATA = mysql_fetch_array($Query_Run, MYSQL_ASSOC))
            {
                $data_array[] = $DATA;
            }
            return $data_array;
            close();

    }
    else{
            die(mysql_error());
        }

    mysql_close();

}

スクリプトのどこでも使用でき、データを含む配列が返されます。2行で。

$sql = 'SELECT * FROM users';
$users = execute_query($sql);

次に、PDOで同じ機能を使用する必要があります。私は試してきましたが、PDOを使用して同じことを行うクラスまたは関数を作成するにはどうすればよいですか。

私が言おうとしていること。同じ4行を記述してクエリを作成する代わりに、関数またはクラスにクエリを取得させてデータを返す方法はありますか?

ありがとうございました。

4

3 に答える 3

1

あなたのコードは悪いです。真剣に。関数はステートメントのclose()後にあるため、呼び出されることはありません。まったく同じ理由で、が呼び出されることもありませんreturnmysql_close()

そうは言っても、これが私が使用する関数です:

function execute_query( $con, $query, $statements ) {
    $q = $con->prepare( $query );
    foreach ( $statements as $statement ) {
        $q->bindParam( $statement[ 'string' ], $statement[ 'value' ], $statement[ 'type' ] );
    }
    $q->execute();
    return $q->fetchAll();
}

そして、これを使用したコードサンプルは次のとおりです。

$con = new PDO( /* ... */ );
$query = "SELECT * FROM users WHERE id = :id";
$statements = array();
// Prepare a statement array
$id = array(
    'string' => ':id',
    'value' => $_GET[ 'id' ],
    'type' => PDO::PARAM_INT
);
// Add the statement to the array
$statements[] = $id;
$results = execute_query( $con, $query, $statements );

PDOの冗長性には、優れたセキュリティを可能にするプリペアドステートメントが付属しています。ステートメントを準備することは、SQLインジェクションで安全であることを意味します。

于 2012-05-05T06:45:16.973 に答える
1

ヘルパー関数をPDOと連携させるには、いくつかの選択肢があります。

  • PDOオブジェクトを$query
  • 何らかの形式のファクトリクラスを使用して、必要に応じてPDOをインスタンス化します。

最初のものは単純に次のようになります。

function queryGetAll(PDO $pdo, $query)
{
    return $pdo->query($query)->fetchAll(PDO::FETCH_ASSOC);
}

プリペアドステートメントのサポートを追加することで、より便利にすることができます。

function queryGetAll(PDO $pdo, $query, $params = array(), $style = PDO::FETCH_ASSOC)
{
    $stmt = $pdo->prepare($query);
    $stmt->execute($params);
    return $stmt->fetchAll($style);
}

これを呼び出すには:

$results = queryGetAll($pdo, "SELECT * FROM users WHERE uid = ?", array($user_id));

あなたが書くことができるもう一つのラッパーはですqueryGetOne()。これは似queryGetAll()ていますが、最初の結果だけを返します。最後に挿入された識別子を返す、挿入ステートメントのラッパーを作成することも検討してください。

結論

すべてを考慮すると、私は個人的に、これらのラッパーがPDOを使用するだけではまだ利用できない多くの機能を追加しているとは感じていません。

ところで、PDOを使用するときは、PDOから例外がスローされることを許可していることを確認してください。これは、コードのデバッグに役立ち、不格好なコードを回避します。

于 2012-05-05T06:28:38.340 に答える
0

迅速で汚いが少し冗長な解決策はこれです

function execute_query( $query, $params ) {
    global $pdo;
    $stmt = $pdo->prepare( $query );
    $stmt->execute($params);
    return $stmt->fetchAll();
}
$users = execute_query('SELECT * FROM users WHERE id=?',array($id));

でも個人的には言葉を書くのが嫌いなarrayので、このように使っfunc_get_args() て呼んでいます

function execute_query() {
   global $pdo;
   $args  = func_get_args();
   $query = array_shift($args);
   $stmt  = $pdo->prepare($query);
   $stmt->execute($args);
   return $stmt->fetchAll();
}
$sql   = 'SELECT * FROM users WHERE username=? AND password=?';
$found = execute_query($sql,$username,$password);

しかし、クラスを持っている方が明らかに良いでしょう。
これにより、次のように、さまざまな結果セットに対してさまざまな関数を使用できるようになります。

$username = db::getOne('SELECT name FROM users WHERE id=?',$id);

あなたの現在の代わりに

$user     = execute_query('SELECT name FROM users WHERE id=?',$id);
$username = $user['name'];

または、さらに便利なもの

$users = db::getIndexed('id','SELECT name FROM users);

キーがユーザーIDまたは

$ids = db::getCol('SELECT id FROM users');
$in  = implode(",",$ids);
于 2012-05-05T07:01:40.603 に答える