【问题标题】:Can anyone help me figure out the meaning of this php error message? [duplicate]谁能帮我弄清楚这个php错误消息的含义? [复制]
【发布时间】:2011-08-15 05:45:52
【问题描述】:

可能重复:
Can anyone help me figure out what is wrong with this code?

这是我的代码

$con = mysql_connect("localhost", "root", '');

if (!$con) {
    die('Cannot make a connection');
}


mysql_select_db('yumbox_table', $con) or die('Cannot make a connection');    
isset($_POST['user_name'], $_POST['password'], $_POST['user_type']);

$data = mysql_query("SELECT * 
                       FROM users 
                      WHERE user_name == ($_POST['user_name']) 
                        AND ($_POST['password']) 
                        AND ($_POST['user_type'])") or die(mysql_error());

$info = mysql_fetch_array($data);
$count = mysql_numrows($data);

if ($count == 1) {
    echo("Success!!");
} else {
    echo("BIG FRIGGIN FAILURE!!");
}

mysql_close($con);

每当我运行此代码时,我都会收到以下消息:

【问题讨论】:

  • 什么错误信息,贴在这里
  • 也许他的意思是他得到了一个空白页。他是否打开了错误显示?
  • 我不完全确定查询在做什么... WHERE username = $_POST['username'] AND $_POST['password'] AND $_POST['usertype']。这没有多大意义。而且,是的,你的代码是一个等待黑客的大洞。
  • @prodigitalson:它是further back than that。 OP 希望我们为他们做这一切。

标签: php mysql forms


【解决方案1】:
if(isset($_POST['user_name'], $_POST['password'], $_POST['user_type'])){
    $data = mysql_query("SELECT * from users 
             where user_name = '".mysql_real_escape_string($_POST['user_name'])."' and 
                   password  = '".mysql_real_escape_string($_POST['password'])."' and 
                   user_type = '".mysql_real_escape_string($_POST['user_type'])."' ");

    if(mysql_numrows($data) == 1) {
       $info = mysql_fetch_array($data);
       echo("Success!!");
    } else {
       echo("BIG FRIGGIN FAILURE!!");
    }
}
else{
   echo "Required Data Missing";
}

mysql_close($con);

【讨论】:

【解决方案2】:

您需要发布错误以获取更多详细信息。但我注意到的一些事情是

mysql_query("SELECT * from users where user_name == ($_POST['user_name']) and ($_POST['password']) and ($_POST['user_type'])")

你需要把它改成

//do escaping here. See note below.
$username = isset($_POST['user_name']) ? mysql_real_escape($_POST['user_name']) : '';
$pass     = isset($_POST['password']) ? mysql_real_escape($_POST['password']) : '';
$type     = isset($_POST['user_type']) ? mysql_real_escape($_POST['user_type']) : '';

mysql_query("SELECT * from users where user_name = '{$username}' AND password = '{$pass}' AND user_type = '{$type}'")

你需要转义值

MySQL 比较是 = 而不是 ==(感谢@jeremysawesome 指出这一点)

您需要根据您的 POST 值检查该列

您还有一个SQL injection vulnerability。请至少使用mysql_real_escape。更好的是,切换到PDO

您需要将isset 检查分配给一个变量并检查它。否则就是浪费。

【讨论】:

  • 另外 - 我相信双 == 应该是单 = 用于 SQL 比较。
  • @jeremysawesome 确实!更新答案
  • @jeremysawesome 在我开始正确阅读问题时注意到了许多其他内容
【解决方案3】:

在将 POST 值插入查询之前,您需要对其进行转义。在数据库查询中使用 POST 值之前,您应该转义它们。

而不是这个:

$data = mysql_query("SELECT * from users where user_name == ($_POST['user_name']) and ($_POST['password']) and ($_POST['user_type'])"

这样做:

$user_name = mysql_real_escape_string($_POST['user_name']);
$password = mysql_real_escape_string($_POST['password']);
$user_type = mysql_real_escape_string($_POST['user_type']);
$data = mysql_query("SELECT * FROM users WHERE user_name == '$user_name' AND password == '$password' AND user_type == '$user_type'");

请注意,我假设表中的列是“user_name”、“password”和“user_type”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多