0

最初から同じ問題を抱えている人はほとんどいませんが、私の問題は電子メール ID に固有のように思われるため、この質問を繰り返します。

入力として特定の電子メール ID を指定してパスワードを取得するクエリがあります。これは私のクエリです

Select Password from userauth where user_name in (select id from users where email = 's.sriram@example.com')

このクエリは、phpMyAdmin から実行すると問題なく実行されます。

ただし、phpスクリプトを使用すると機能しません。そのphpスクリプトは次のとおりです。

<?php

// Grab User submitted information
$email = $_POST["users_email"];
$pass = $_POST["users_pass"];

// Connect to the database
$con= mysql_connect("localhost","root","sriram123");
// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// Select the database to use
mysql_select_db("mydb",$con);

echo "Select Password from userauth where user_name in (select id from users where email = '$email')";

$result = mysql_query("Select Password from userauth where user_name in (select id from users where email = $email)");

if($result === FALSE) {
    echo "Error Occured. ";
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['Password'];
}


mysqli_close($con);
?>

これを実行すると、次のようなエラー メッセージが表示されます。

SQL 構文にエラーがあります。1 行目の '@example.com)' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

私はPHPが初めてで、なぜこのことがphpMyAdminで機能するのかわかりませんが、私のPHPスクリプトでは機能しません。

4

4 に答える 4

6

xkcd

変数を適切な引用符で囲んでいないように見えますがmysql_real_escape_string、クエリで使用しても実際に安全であることを確認するために使用する必要があります。

于 2013-09-15T16:23:41.067 に答える
0

$email変数の周りに正しい引用符がありません。それらを一重引用符で囲んでみてください。

コードを次のように変更します。

$email = mysql_real_escape_string($email); //escaping
$query = "
SELECT Password
FROM userauth
WHERE user_name IN
    (SELECT id
     FROM users
     WHERE email = '$email')
     ";

$result = mysql_query($query);

また、現在の MySQL クエリはSQL インジェクションに対して脆弱であるため、ユーザー入力のエスケープを検討する必要があります。いっそのこと、推奨されない関数の使用をやめて、またはmysql_*に切り替えてください。MySQLiPDO

于 2013-09-15T16:24:11.020 に答える