0

簡単なログオンスクリプトを実行しようとしています。つまり、POSTアクションを介してフォームコンテンツを受け入れます。一致するレコードがないかデータベースを確認してください。その行から、などの他の情報を取得しFull Nameます。

私が持っているコードは次のとおりです。

if ( !isset($_POST['loginsubmit']) ) {
    //Show login form
    ?>

    <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
        <p>
            Account ID:
            <input name="AccountID" type="text" />
        </p>
        <p>
            Username:
            <input name="userEmail" type="text" />
        </p>
        <p>Password:
            <input name="userPassword" type="password" />
        <p>
            <input name="loginsubmit" type="submit" value="Submit" />
        </p>
    </form>
    <?php
}
else {
    //Form has been submitted, check for logon details
    $sql = "SELECT * FROM users WHERE 'accountID'=". $_POST['AccountID']. " AND     'userEmail'=". $_POST['userEmail'] . " AND 'userPassword'=". $_POST['userPassword']. "     LIMIT 1";
    $result = mysql_query($sql);
    $count = mysql_num_rows($result);
    if ($count == 1){
        echo"Correct Username/Password";
    }
    else {
        echo "Wrong Username or Password";
    }
}

私には2つの問題があります。まず、上記のコードで、次のエラーが発生し続けます。

警告:mysql_num_rows()は、パラメーター1がリソースであると想定しています。ブール値は...で指定されます。

次に、データベースから他の詳細フィールドを取得するにはどうすればよいですか。私は推測します

$result=mysql_query($sql);

MySQL行の配列が含まれているので、次のようなことができますか。

echo $result['fullName'];
4

4 に答える 4

2

まず、SQLインジェクションを防ぐために、フィールドをサニタイズします。

$sanitize_fields = array('AccountID','userEmail','userPassword'); 
foreach( $sanitize_fields as $k => $v ) 
{
    if( isset( $_POST[ $v ] ) ) 
        $_POST[ $v ] = mysql_real_escape_string( $_POST[ $v ] ); 
}

次に、クエリの文字列フィールドを引用します。最初は、クエリにエラーがありました。これが、ブール値falseを取得していた理由です。

$sql = "SELECT * FROM users WHERE accountID='". $_POST['AccountID']. "' AND userEmail='". $_POST['userEmail'] . "' AND userPassword='". $_POST['userPassword']. "' LIMIT 1";

クエリを実行した後、MySQLによって生成されたエラーがある場合は、それを確認するために次のことを行うことをお勧めします。

$result = mysql_query($sql) or die('Query failed: ' . mysql_error());

MySQL拡張機能は段階的に廃止されており、MySQLiやPDOなどの新しいより優れた拡張機能があります。それらをご覧ください。

于 2012-05-14T16:13:55.137 に答える
0

SQLステートメントの場合:

$sql = "SELECT * FROM users WHERE 'accountID'=". $_POST['AccountID']. " AND 'userEmail'=". $_POST['userEmail'] . " AND 'userPassword'=". $_POST['userPassword']. " LIMIT 1";

表でuserEmailとuserPasswordが文字列の場合は、単一のqoutesを追加してください。

$sql = "SELECT * FROM users WHERE accountID=". $_POST['AccountID']. " AND userEmail='". $_POST['userEmail'] . "' AND userPassword='". $_POST['userPassword']. "' LIMIT 1";

結果を取得するには:

$result = mysql_query($sql);

while ($row = mysql_fetch_array($result))
{
    if(mysql_num_rows($result) > 0)
        echo $row['COLUMN_NAME'];
    }
}

あなたのコードは非常に安全ではありません:

  • データベースと対話するには、MySQLiまたはPDOを使用してください
  • データベースに送信する前に、すべての入力データをエスケープしてください
于 2012-05-14T16:08:48.273 に答える
0

これを試して:

    else {
        //Form has been submitted, check for logon details
        $conn = mysql_connect("db-host-here","db-user-here","db-pass-here");

        $sql = "SELECT * FROM users WHERE accountID=". mysql_real_escape_string($_POST['AccountID']). " AND userEmail='". $_POST['userEmail']=mysql_real_escape_string($_POST['userEmail']); . "' AND userPassword='".  $_POST['userPassword']=mysql_real_escape_string($_POST['userPassword']);. "' LIMIT 1";
        $result = mysql_query($sql,$conn);
        $count = mysql_num_rows($result);
        if($count == 1){
            echo"Correct Username/Password";
        }
        else {
            echo "Wrong Username or Password";
        }
    }
    // Get other information:

    $dbInfo = mysql_fetch_assoc(); //If more than one row can be selected, use a while loop.

    //Now play with $dbInfo:

    echo $dbInfo['some_other_column'];

クエリに不要な一重引用符があり、必要な場所で引用符が欠落しています。上記のコードを試してください。

db-host-heredb-user-hereおよびdb-password-hereを正しいデータベース情報に置き換えます。

インジェクション攻撃を防ぐために、コード内でいくつかのエスケープを実行しました。ただし、プリペアドステートメントの使用を実際に検討する必要があります。

于 2012-05-14T16:10:19.893 に答える
0

ここでの問題は、クエリが行を選択できないため、呼び出しFALSEからブール値が返されることです。mysql_query

クエリを修復し、次の$result = mysql_query($query);ように、戻り値がfalseかどうかを常に確認する必要があります。

// ...
$result = mysql_query($query);
if($result !== false) {
    $count = mysql_num_rows($result);
    // ...
}

ただし、PDOまたは少なくともmysqlihttp://php.net/mysqliを使用することをお勧めします

于 2012-05-14T16:16:42.827 に答える