【问题标题】:sql query fails every timesql查询每次都失败
【发布时间】:2017-04-07 06:40:39
【问题描述】:
<html>
<head>
</head>
<body>
<form action="login_process.php" method="post">
SID: <input type="text" name="sid">
<br />
Password: <input type="text" name="pw">
<br />
<input type="submit" value="Login">
</form>
</body>
</html>

login_process.php FILE

<html>
<head>
</head>
<body>
<?php
include ("connection.php");

$sid = $_POST['sid'];
$pw = $_POST['pw'];

setcookie("username", "$sid". time()+86400);

$result = mysqli_query($con, "SELECT SID FROM student_table WHERE SID='$sid' and password='$pw'") or die('Query failed');


if(!$result){
    echo "Failed";
    } else {
        echo "success". $_COOKIE['username'];
        $_SESSION['username'] = $sid;
        }        
?>
</body>
</html>

我的student_table 中有数据。但无论我给出什么输入,它都表示成功。即使我在没有任何输入的情况下单击登录按钮,它仍然显示成功。请帮忙。

【问题讨论】:

  • 失败怎么办?您能给我们提供更多细节吗?
  • 可能需要引用你的$sid$pw
  • 如果您使用 MySQLi,请使用绑定变量,而不是将值直接注入 SQL 查询中
  • 哈哈哈,现在总是成功!!!即使我点击空白字段的“登录”。是 if 语句中的东西吗?
  • 一个成功的结果并不意味着它找到了一条记录,你必须以不同的方式检查......一个成功的结果意味着一个查询已经执行并且没有错误返回一个,一个或多个结果

标签: php mysql sql


【解决方案1】:

在 sql 查询中赋值时应该使用引号。

SELECT 
    SID 
FROM 
    student_table 
WHERE 
    SID = '$sid' and password = '$pw'

也期待Prepared Statements来保护自己免受sql注入。您还应该添加下面的代码来获取选定的行:

while ($row = mysqli_fetch_array($result)) {
   $_SESSION['username'] = $row['SID'];
}

【讨论】:

    【解决方案2】:

    开始学习基本调试:

    当查询失败时,只需这样做:

    不要运行它(mysql_query,或 mysqli_query 或任何你有的),ECHO 它:

    echo "SELECT SID FROM student_table WHERE SID='$sid' and password='$pw'";
    

    提交表单后,您将看到正在运行的查询,转到 phpmyadmin 或您使用的任何工具并手动运行查询。看看是否有错误,也更容易看到发生了什么。建议当您这样做时,首先尝试 phpmyadmin 中的查询,然后在您确信它们没问题后将它们应用到代码中。

    【讨论】:

    • 曾经尝试过将包含 html 的代码“回显”到网络浏览器?我更喜欢'var_dump'。因为它将接受多个参数。我倾向于这样做:var_dump($thing, __FILE__, __LINE__);。这也显示了我以后需要从哪里删除它。
    • 我回应了 $result 并且它总是 1。如果有 SQL 错误,它只会是假的。否则,即使您的 SELECT 语句没有返回任何行,它也将始终返回资源 ID。根据您的建议,我跟踪了该错误!谢谢:)
    【解决方案3】:

    这并不是一个真正的答案,而是更多关于如何在您的代码无法按预期工作时找出问题所在。

    首先,始终将您的 SQL 放入一个变量中。为什么,所以你可以“var_dump”它,看看发生了什么。所以,试试这个:

    $sql = "SELECT SID FROM student_table WHERE SID=$sid and password=$pw";
    
    var_dump($sql, 'my_query'); // you will see what PHP created.
    

    然后尝试提供的答案:

    $sql = "SELECT 
        SID 
    FROM 
        student_table 
    WHERE 
        SID = '$sid' and password = '$pw'";
    

    至少你会看到可能不正确的地方。

    var_dump($sql, 'the answer_query'); // you will see what PHP created.
    

    $result = mysqli_query($con, $sql) or die('查询失败');

    外引号必须是"(双引号)而不是"'"(单引号)两者都是完全有效的PHP。前者允许在字符串中替换变量。 后者会将所有内容视为文字字符串。

    【讨论】:

    • 这是输出:object(mysqli_result)[2] public 'current_field' => null public 'field_count' => null public 'lengths' => null public 'num_rows' => null public' type' => null string 'my_query' (length=8) 成功
    • 用 var_dump 的结果更新你的问题。请不要在 cmets 中发布您的信息,因为人们总是先阅读问题。将您的问题视为一个“活的”文档,当您发现有关该问题的更多信息时会对其进行更新。您正在告诉人们您的进步以及失败的地方。
    猜你喜欢
    • 2014-05-11
    • 2020-10-15
    • 2015-02-23
    • 2011-10-11
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多