1

フォームデータをデータベースに入力する前に検証する必要があるフォームがWebサイトにあります。

ユーザーがmysql_num_rows関数によってユーザー名がすでに存在するかどうかをチェックします。しかし、私はそれを機能させることができないようです。テスト時には、新しいユーザー名を追加することはできません。

使用されている完全なコードは次のとおりです。

<?php
session_start();

include("databaseConnect.php");
// Insert a row of information into the table "example"


// check if username is already in database
if(mysql_num_rows(mysql_query("SELECT userName FROM registeredUsers WHERE userName =     '$_POST[userName]'"))){
 echo "Username: ". $_POST[userName]." already exists in the Database<br><br>";
    echo "You will be redirect back to the form in 5 seconds";
$ref = $_SERVER['HTTP_REFERER'];
header( 'refresh: 5; url='.$ref);

//check if hemis is already in database
}elseif(mysql_num_rows(mysql_query("SELECT hemis FROM registeredUsers WHERE hemis = '$_POST[hemis]'"))){
echo "Student [Hemis] Number: ". $_POST[hemis]." already exists in the Database<br><br>";
echo "You will be redirect back to the form in 5 seconds";
$ref = $_SERVER['HTTP_REFERER'];
header( 'refresh: 5; url='.$ref);


// if all the conditions above are fine, it will insert the data to MySQL
}else{
  mysql_query("INSERT INTO registeredUsers
(firstName, lastName, hemis, userName, MAC) VALUES('$_POST[firstName]', '$_POST[lastName]', '$_POST[hemis]', '$_POST[userName]', '$_POST[mac]' ) ")
or die(mysql_error());

echo "Data Inserted! <br><br>";
}

どうもありがとう :)

4

2 に答える 2

1

mysql_query の結果も確認することをお勧めします。行数を取得できる結果セットが返される場合がありますが、クエリが失敗した場合は false が返される可能性があります。その場合、結果セットはなく、mysql_count_rows は失敗します。失敗すると、0 行として解釈されます。

Matty が提供してくれたすばらしい提案とは別に、追加のチェックと厳密な型チェックも行います。

if ($result = mysql_query('....') === false)
{
  die('Your query failed in the first place. Error: ' . mysql_error());
}

できる改善点はたくさんありますが (クエリで count を使用するなど)、少なくともこれらの種類のチェックは必要だと思います。推測するのではなく、実際に何が問題なのかを理解するのに役立ちます。初心者でも経験豊富なプログラマーでも、デバッグ時間を大幅に節約できます。

于 2011-05-29T11:54:25.803 に答える
1

これを完全に書き直します。SQL インジェクションの影響を受けやすく、非効率的で、少し簡潔すぎます。さらに、通常はPHP mysqli 拡張機能を使用した方がよいでしょう。

また、必ず $_POST 変数名を引用符で囲んでください。文字列ではなく、定数として記述しました。(文字列値を表すコード内の別の場所で定数を定義していない限り、これはエラーです。開発中は PHP の警告を有効にしてください。)

$safe_username = mysqli_real_escape_string($_POST['userName']);
$sql = "SELECT userName FROM registeredUsers WHERE userName='$safe_username' LIMIT 1";
$result = mysqli_query($database_connection, $sql);
if (mysqli_num_rows($result))
{
    // username already found code
    mysqli_free_result($result);
}
else
{
    $safe_hemis = mysqli_real_escape_string($_POST['hemis']);
    $sql = "SELECT hemis FROM registeredUsers WHERE hemis='$safe_hemis' LIMIT 1";
    // Side note, LIMIT 1 tells the database engine to stop looking after it's found one hit. More efficient as you're only looking for a Boolean value anyway.
    $result = mysqli_query($database_connection, $sql);
    if (mysqli_num_rows($result))
    {
        // hemis found code
        mysqli_free_result($result);
    }
}

残りはおそらくこれから理解できます。

すべての入力を検証してエスケープしてください。検証には、サニティのチェックが含まれます - データが境界内 (文字列の長さ、数値の境界など) であるかなど。すべての入力は悪です!

HTTP_REFERER にも依存したくありません。ユーザー エージェントは常にリファラーを渡すとは限りません。

また、大したことではないことはわかっていますが、ではなく CSS を使用します<br>。XHTML doctype を使用している場合は、すべてのタグを適切に閉じる必要があるため<br><br />. とにかくこれは良い考えです。

于 2011-05-29T11:38:36.873 に答える