0

ここでお聞きしたいのですが。今、私はデータをテーブルに挿入するフォームを作成します。すでに持っているこのテーブルkemaskini

+------+----------+----------+
|  no  |    Item  | kuantiti |    
+------+----------+----------+
|  1   | Speaker  |   10     |
+------+----------+----------+
|  2   | Laptop   |   10     |
+------+----------+----------+
|  3   | Mouse    |   10     |
+------+----------+----------+

フォームに「スピーカー」と入力すると、送信します。トレースして、再試行すると言います。すでに持っているので。ここに書いたコーディング。テーブルkemaskiniの行1のみをトレースします。フォームに「ラップトップ」と入力すると、送信します。正常に挿入します。

「スピーカー」と「スピーカー」をトレースする方法は同じです。

        if (isset($_POST['submit']))
        { 
        $result = mysql_query("SELECT Item FROM kemaskini");
        $test = mysql_fetch_array($result);
        $trace=$test['Item'];


        if($_POST['Item']==$trace)
        {

        echo "Try Again";

        }

        else
        {   
        $item=$_POST['Item'] ;
        $kuantiti= $_POST['kuantiti'] ; 

        mysql_query("INSERT INTO `kemaskini`(Item,kuantiti) 
        VALUES ('$item','$kuantiti')"); 

        header("Location: kemaskini.php");

        }
        }
4

2 に答える 2

1

その理由は、結果をループしていないため、結果mysql_fetch_array()の最初の値のみをチェックしているためです。繰り返したくない場合は、クエリを次のように変更できます。

$itemToSearch = "Speaker";
$result = mysql_query("SELECT COUNT(*) result 
                       FROM kemaskini
                       WHERE Item = '$itemToSearch'")

見つかったアイテムの総数がわかります。

$test = mysql_fetch_array($result);
$trace = $test['result'];

if($trace > 0)
{
    echo "Try Again";
}
else
{
 // insert value
}

SQL Injection補足として、変数の値(s)が外部からのものである場合、クエリは脆弱です。それを防ぐ方法については、以下の記事をご覧ください。を使用PreparedStatementsすると、値を一重引用符で囲む必要がなくなります。

于 2013-03-24T03:51:05.773 に答える
0

「Speaker」と「speaker」が同じであることをどのように追跡できるかについては、ほとんどのデータベースエンジンがサポートしているupper()またはlower()関数を使用できます。私はmysqlを使用していないので、ここで仮定を立てます。チェックは次のようになります。

select count(*) records 
from kemaskini
where lower(item) = 'speaker'

そうは言っても、このようなwhere句で関数を使用すると、クエリの実行が遅くなることを警告する必要があります。

PreparedStatementsに関するJWのコメントにクエリパラメータの使用が含まれている場合(私もphpを使用していません)、それは非常に良いアドバイスです。アプリケーションのセキュリティを強化するだけでなく、アポストロフィなどの特殊文字をエスケープします。文字検索を行っているので、ユーザーが「Dave'skeyboard」のようなものをアプリケーションに送信した場合にクエリがクラッシュすることは望ましくありません。

于 2013-03-24T04:15:48.657 に答える