1

後でPDOオブジェクトを使用してデータベースに接続するためにそれらを使用できるように、いくつかの関数を作成しようとしています。1つはデータを返すため、1つはカウントを取得するため、もう1つは挿入を行うために実行しました。

私の問題は、例外があるときにそれらの非が例外を返すことです。結果をメモリから解放するためにどこに行を追加する必要があるのか​​わかりませんか?

これが私の現在の機能です

function getDataSet($query, $connection){

    $cmd = $connection->query( $query );
    return $cmd->fetchAll(PDO::FETCH_ASSOC);

}


function getResultsCount($query, $connection){

    $cmd = $connection->query( $query );
    return $cmd->fetchColumn();

}

function insertRecord($query, $connection){

    $cmd = $connection->query( $query );
    $connection->free();
    return $cmd;

}

これが私のアプリケーションでこれらの関数を使用する方法です

        try {
        $data = getDataSet(' SELECT name FROM TABLE LIMIT 1000', $db);

            foreach($data AS $row){
                echo $row[0]['name'] . '<br />';
            }

        }  catch(PDOException $e){
            echo 'an error encountered'. $e->getMessage();
        }
unset($data);

私の質問の夏これらの関数が戻った後、結果を解放するにはどうすればよいですか?一度存在した場合、どうすれば例外を返すことができますか?私が使用できるより良い機能はありますか?prepareステートメントを処理して結果を返す関数はありますか?

ありがとう :)

4

1 に答える 1

1

このような優れたプログラミングの質問を見ることは、常に喜びです。珍しいものですが。

1 つの大きな間違いがありますが、これらすべての関数を作成する目的は十分にあります。それらを別々の関数として使用しているため、あまり意味がありません。これらの関数はすべて、内部クラス リソースを使用するデータベース クラスのメソッドである必要があります。

ほとんどの回答はタグ wikiから取得できますが、このサイトは訪問者をこのナレッジ キャッシュに誘導することはないようで、既に書かれた回答を読む代わりに新しい質問をするように促しています。それで、ここに行きます:

一度存在するときに例外を返すにはどうすればよいですか?

PDO で例外を発生させるには、対応するオプションを設定する必要があります。

$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'root','', $opt);

このようにインスタンス化されると、PDO は mysql エラーで例外をスローし始めます。

準備ステートメントを処理して結果を返す関数はありますか?

ただ書いてください。
関数で準備/実行を使用したくないのはなぜですか? これが1つです(別の関数ではなく、クラスメソッドです):

function getDataSet($query,$data = NULL)
{
    $cmd = $this->conn->prepare( $query );
    $cmd-> execute($data);
    return $cmd->fetchAll();
}

これで、パラメーター化されたクエリと非パラメーター化されたクエリを使用できるようになります。

$data = $db->getDataSet('SELECT name FROM TABLE LIMIT 1000');
$data = $db->getDataSet('SELECT name FROM table WHERE id < ? LIMIT 1000',array($id));
foreach($data AS $row){
    echo $row['name'] . '<br />';
}

(エラーメッセージをエコーするためだけに try-catch を使用しないでください - PHP はすでにそれを行っていますが、はるかに優れた方法です)

結果フォームメモリを解放する行をどこに追加する必要がありますか?

私はまったく気にしません。それらは自動的にクリアされます。

function getResultsCount($query, $connection){

実際のところ、この関数は単にカウントを返すだけではありません。実際には、クエリによって返されるスカラー値を返すことができます。したがって、それを呼び出す方がよいgetOneResultか、またはそのようなもの:

$name = $db->getDataSet('SELECT name FROM table WHERE id=?',array($id));

function insertRecord($query, $connection){

この関数も間違った方法で命名されています。実際のところquery()、INSERT、UPDATE、DELETE、またはその他のクエリを実行するために使用できる単なる汎用関数でなければなりません。

私が使用できるより良い機能はありますか?

まあ、間違いなく、まさにこの目的のために書かれた独自のクラスの
方が優れていると思います:) そのまま自由に使用することも、独自のクラスのアイデアを得るだけでもかまいません。

于 2013-03-23T12:38:49.027 に答える