0

関数を使用してデータベースから複数の行をプルするにはどうすればよいですか?

私が持っている機能は次のとおりです。

function search($subject, $table) {
    $query = "SELECT {$subject} ";
    $query .= "FROM {$table} ";
    $content = mysql_query($query);
    return $content;
}

私が持っている関数を呼び出しているページで:

if (isset($_POST['search'])){
    $search = $_POST['search'];
}

$content = search($subjectName, $tableName);

while ($results = mysql_fetch_assoc($content)){
    $phrase = $results[$subjectName];
    //if phrase exists in database
    if (strpos($search,$phrase) !== false) {
        echo $phrase;
    //if phrase does not exist in database
    } else {
        echo 'fail';    
}

この設定は機能しませんが、すべてを関数に入れると機能します。

function search($subject, $table, $where = 0, $is = 0) {
    global $search;
    $query = "SELECT {$subject} ";
    $query .= "FROM {$table} ";
    if ($where > 0) {
        $query .= "WHERE {$where} = '{$is}' ";
    }
    $content = mysql_query($query);
    while ($results = mysql_fetch_assoc($content)){
        $phrase = $results[$subject];
        //if phrase exists in database
        if (strpos($search,$phrase) !== false) {
            echo $phrase;
        //if phrase does not exist in database
        } else {
            echo 'fail';
        }
    }
    return $content;
}

ページ上:

search('main_subject', 'main_search');

問題は、ifステートメントでその関数を再度呼び出して、別のフレーズを検索するようにすることです。これを行う簡単な方法はありますか?

編集:現在の設定では、最初のアイテムが無限ループになります。

4

1 に答える 1

2

ここで対処する必要のある問題がいくつかあります。

まず、特定の部分一致のフィールドを検索しようとしている場合は、SQLLIKE構造を使用することをお勧めします。

SELECT field FROM table WHERE field LIKE '%search phrase%'

これを行うと、検索フレーズに一致する行のみが返され、それ以上は返されないため、検索フレーズの文字列比較を実行しようとして各行を反復処理する必要がなくなります。

第二に、global関数でデータを利用できるようにするために使用することは、実際には悪い習慣です。実際には、関数に必要なデータをパラメーターとして関数に渡す必要があります。これには、検索文字列と、おそらくデータベース接続/オブジェクトが含まれます。

function search($field, $table, $search, $db) {
    ...
}

第三に、あなたは現在SQLインジェクションを防ぐために何もしていません。入力データをエスケープする必要があります。または、プリペアドステートメントを使用することをお勧めします。

第四に、あなたは本当に関数を使うべきではありませんmysql_*。それらは非推奨です。mysqliまたはを使用してみてください(そして、これらのいずれかでプリペアドステートメントを使用する方法を学ぶことPDOを強くお勧めします)。オブジェクト指向の使用法を好むでしょう)。mysqlimysql_*

第五に、あなたの最初の質問に。複数のフレーズを検索したい場合は、いくつかのアプローチがあります。次のように、すべてのフレーズを一度に渡すことができます。

SELECT field FROM table WHERE field LIKE '%search phrase%' OR field LIKE '%another search phrase%'

または、反復関数呼び出しを行って、必要な結果を得ることができます。これは、最初のフレーズが成功しなかった場合にのみ2番目のフレーズを検索するか(反復アプローチを使用)、1つのクエリですべての可能な一致を検索するか(LIKE-OR-LIKEアプローチを使用)によって異なります。

于 2013-01-22T18:24:39.840 に答える