【问题标题】:php not getting user info from databasephp没有从数据库中获取用户信息
【发布时间】:2013-12-06 20:58:16
【问题描述】:

数据库信息正确且有效,我已对此进行了多次测试。数据库与我试图从中提取数据的表一起存在。我在数据库中有虚拟信息,这是我的代码来检查数据库中的用户是否为“网络”,表“用户”:

<?php 
require 'core/init.php';

if (empty($_POST) === false){
    $username = $_POST['username'];
    $password = $_POST['password'];

    if (empty($username) === true || empty($password) === true) {
        $errors[] = 'You need to enter a username and password.';
    } else if (user_exists($username) === false) {
        $errors[] = 'Username does not exists. Have you registered?';
    } else if (user_active($username) === false) {
        $errors[] = 'Your account is not activated. Please check your email!';
    } else {

    }

    print_r($errors);
}
?>

这里是函数'user_exists($username)'的代码

<?php


function user_exists($username) {
    $username = sanitize($username);
    return (mysql_result(mysql_query("SELECT COUNT('user_id') FROM 'users' WHERE 'username' = '".$username."'"), 0) === 1) ? true : false;
}

function user_active($username) {
    $username = sanitize($username);
    return (mysql_result(mysql_query("SELECT COUNT('user_id') FROM 'users' WHERE 'username' = '".$username."' AND 'active' = 1"), 0) === 1) ? true : false;
}
?>

消毒功能:

<?php
function sanitize($data) {
    return mysqli_real_escape_string($data);
}
?>

这是我的问题:

当我使用虚拟信息登录时 - 用户名;密码(通过 phpmyadmin 散列的 md5)如果显示错误:

'用户名不存在。你注册了吗?'

我尝试过使用不同的数据库、不同的用户.. 没有任何效果.. 帮助!

【问题讨论】:

  • 用反引号`替换列名和表名中的单引号。也看看这个链接:dev.mysql.com/doc/refman/5.5/en/reserved-words.html
  • @vinodadhikary 没有什么不同。
  • 结合下面的两个答案:) 编辑:有人删除了第二个。
  • @Aragon0 我做了,我仍然得到用户不存在。
  • 给我们 MySQL 错误:“echo mysql_error();”在 user_exists 调用之后。

标签: php mysql


【解决方案1】:

对列名和表名使用反引号,而不是引号。

"SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '".$username."'")

return (mysql_result(mysql_query("SELECT COUNT('user_id') 
FROM 'users' WHERE 'username' = '".$username."'"), 0) === 1) ? true : false;
}

mysql_results 返回一个单元格或 false,因此永远不会达到条件 ===1

Docs

成功时从 MySQL 结果集中返回一个单元格的内容, 或 FALSE 失败。

return (mysql_result(mysql_query("SELECT COUNT('user_id') 
FROM 'users' WHERE 'username' = '".$username."'"), 0) == false) ? false: true;
}

您还与mysql 连接并在sanitize 函数中使用mysqli_real_escape_string。不要混合它们。

【讨论】:

  • 这并没有什么不同。我仍然得到用户不存在。
  • 这种编码实践促进了sql注入。
  • @JustinE 这不是一个实时项目,这是一个学习项目。
  • @JustinE 不,它没有。他对输出进行消毒。
  • 知道了,谢谢。导致问题的是卫生设施 mysqli_*,我将其更改为 mysql_。我尝试将 mysql_ 转换为 mysqli_*,但 mysqli_result 似乎不喜欢这一行: return (mysqli_result(mysqli_query("SELECT COUNT(user_id) FROM users WHERE username = '".$username. "'"), 0) == 1) ?真假; -- 它将 mysqli_result 显示为无效命令。我会解决的。谢谢!
【解决方案2】:
function user_exists($username) {
    $username = sanitize($username);
    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '".$username."'"), 0) == 1) ? true : false;
}

function user_active($username) {
    $username = sanitize($username);
    return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '".$username."' AND `active` = 1"), 0) == 1) ? true : false;
}

做了什么:

  1. 用 `

  2. 替换列名的 ''
  3. 使用 == 而不是 ===

【讨论】:

    【解决方案3】:

    PDO:

    function user_exists($username) {
        $db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password', array(PDO::ATTR_EMULATE_PREPARES => falsse, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        $stmt = $db->query("SELECT `user_id` FROM `users` WHERE `username` = '".$username."'"));
        $row_count = $stmt->rowCount();
        if($row_count==="1"){return true;}else{return false;}
    }
    

    【讨论】:

    • 错了!如果使用 MySQL COUNT() 表达式计算行数,它将返回一行的行数。您的代码将始终返回 true。您需要获取第一行,然后检查第一列。
    • 我已经更新了我的答案。它现在找到与用户名匹配的用户,并计算返回的行数。
    猜你喜欢
    • 2014-07-19
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2012-10-31
    • 2019-04-15
    相关资源
    最近更新 更多