-1

データベースに検索オプションを追加しようとしています。次のプログラムを作成しましたが、ループ部分でエラー メッセージが表示され、else ステートメントに移動しない理由がわかりません。親切にチェックして、どこが間違っているか教えてください。

<?php
    require 'connect.php';
    if (isset ($_POST['username']))
    {
        $username = $_POST['username'];
        $query = "select * from users where username like '%$username%' ";

        if ($query_result = mysql_query($query))
        {
            $numrows = mysql_num_rows($query_result);
            if ($numrows > 1)
            {
                for ($i = 0; $i < $numrows; $i++)
                {
                    echo $query_result = mysql_result($query_result, $i, 'username');
                }
            }
            else
            {
                echo 'No Results Found!';
            }       
        }
        else
        {
            echo 'No Results Found!!';
            // echo mysql_error();
        }
    }
    else
    {
        echo 'Are you kidding with me !';
    }
?>

ありがとう

4

3 に答える 3

3

あなたがやっているあなたのループの中で:

echo $query_result=     mysql_result($query_result,$i,'username');

加算されません:echho割り当ての結果を取得しています。課題だけではありません。の戻り値をmysql_resultリソースに再割り当てしています: $query_result。したがって、ループの 2 回目の繰り返しでは、mysql_result呼び出しは失敗します。

とはいえ、このmysql_*拡張機能は非推奨であり、今後は使用しないでください。PDOまたは などの推奨される代替拡張機能を調べてくださいmysqli_*。次を使用して、ループを -loop
として書き直すこともできます。while

$out = '';
while($row = mysqli_fetch_assoc($query_result))
{
    $out .= $row['username'].'<br/>';
}

クエリについて:基本的に、句に一致するすべての行のすべてのフィールドを選択する を実行する
代わりに、関心があるのがユーザー名だけである場合 (コードからはそうであるように思われます)、単純に を使用しないでください。これは DB にとってより簡単であり、それほど多くのリソースを必要としません。SELECT *WHERESELECT username

あなたのWHERE句は を読み取りますusername LIKE '%{$var}%'。これは、入力が である場合、クエリはどこかaを含むすべてのユーザー名を返すことを意味します。aそれはあまりにも安全ではないことを除けば、それはまた非常に遅いです. クエリが完全なテーブル スキャンを実行する可能性が高く、おそらく I/O ディスク操作が必要です。大文字と小文字を区別しないようにするためにワイルドカードを使用likeせずに使用するか、1 文字のワイルドカードを使用するか、必要に応じて 1 つの. 「sup」のユーザー名検索で「superman」が得られる方が、同じ検索で「dinnersupper」が得られるよりも意味があります。%_%

最後に、コードはmysql-injection 攻撃に対して非常に脆弱です。username: を投稿すると、クエリは次のようになります。'; DROP TABLE users; --

select * from users where username like '%'; DROP TABLE users; -- %'

それは災害を綴りますよね?

于 2013-07-02T06:15:13.223 に答える
0

数行のコードを変更しました..ループをwhileループに変更します..これを試してください..

    if($numrows!=0)
    {
        while ($rs = mysql_fetch_array($query_result)){
          echo $rs['username'] . " <br>";
        }
    }

それが役立つことを願っています...

于 2013-07-02T06:41:03.400 に答える
0

ループで呼び出し、クエリ リソースをセルの値にmysql_result置き換えます。$query_result次の呼び出し$query_resultでは、有効なリソースではなくなります。

注:値を使用していないため、何をしようとしているのかわかりません...単に割り当てを削除してください。

于 2013-07-02T06:15:46.200 に答える