如何在准备好的语句中使用sql函数CONCAT


How to use the sql function CONCAT with a prepared statement

向下滚动以帮助我,问题已得到解释

问题几乎解决了

我正在尝试使用cookie执行自动登录脚本,我遇到了一个非常有趣的教程:http://blog.monstruosor.com/2013/05/18/php-auto-connexion-par-cookie/

这是他提出的代码:

function autologin() {
$key = $_COOKIE['autologin'];
$ip = $_SERVER['REMOTE_ADDR'];
$query = "SELECT * FROM users WHERE SHA1(CONCAT('SEL1-df546', `name`, `id`, 'SEL2-sd55fd', `last_connection`, $ip))=$key";
$infos = $users->exec($query);
if(!is_array($infos) || empty($infos)) {
    // Mauvais cookie !
    return false;
}
$_SESSION['user'] = $infos; // Mise en SESSION
return true;

我感兴趣的主线是:

$query = "SELECT * FROM users WHERE SHA1(CONCAT('SEL1-df546', `name`, `id`, 'SEL2-sd55fd', `last_connection`, $ip))=$key";
$infos = $users->exec($query);

然而,它并不安全。我想知道如何使用在这条线上准备的应用程序。我试过这个,但它不起作用:

    $req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT(HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, ip = :ip)) = :key");
    $req->execute(array(
        'ip' => htmlspecialchars($ip),
        'key' => htmlspecialchars($key)));

$this->_db是我班的,写得很好,别担心。问题来自这里:

$req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT(HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, ip = :ip)) = :key");

希望有人能解决问题。


以下是更多信息:

我的index.php页面包含:

$ip = $_SERVER['REMOTE_ADDR'];
$key = $_COOKIE['auto_login'];
$mg->autoLogin($ip, $key);

以及我的类中的autoLogin方法:

    public function autoLogin($ip, $key)
{
    $req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT(HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, :ip)) = :key");
    $req->execute(array(
        'ip' => htmlspecialchars($ip),
        'key' => htmlspecialchars($key)));
    $donnee = $req->fetch();    
    $req->closeCursor();
    if(!is_array($donnee) || empty($donnee)) 
    {
       return false;
    }
    else
    {
        $_SESSION['user'] = $donnee;
        return true;
    }
}

如果您还需要更多信息,只需问我,我会再次更新我的问题!


这是最后一个问题

感谢帕拉,他几乎解决了这个问题

我知道问题出在哪里。在我的数据库中,我试图登录的成员的IP存储为"::1"。但当我执行此处生成的"echo$ip;"时:"$ip=$_SERVER['REMOTE_ADDR']",我有"127.0.0.1"!当我进行验证时,它不是同一个IP,所以问题可能就在这里!知道怎么解决这个问题吗?

问题就在这里,因为如果我做"$ip=':1';",它就起作用了。知道吗??

试试这个:

$req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT('HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, :ip)) = :key");

错误在这里:ip = :ip只需要是:ip,这里CONCAT(HASH1-1dg9sf'也需要是CONCAT('HASH1-1dg9sf'

以下是一些完整的、经过测试的(可工作的)代码。使用PDO。

 $stmt = $pdo->prepare("SELECT * FROM users WHERE SHA1(CONCAT('HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, :ip)) = :key");
        $ip = '10.0.0.1';
        $key = 'HASH1-1dg9sf2himHASH2-dt5w1qalso10.0.0.1';
        $key = sha1($key);
        $res = $stmt->execute(array('ip' => $ip, 'key' => $key));
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));

并具有以下输出:阵列

(
    [0] => Array
        (
            [id] => 2
            [first_name] => him
            [last_name] => also
            [ip] => 10.0.0.1
        )
)

它是从我的测试数据库中的以下行中检索到的:

mysql> SELECT * FROM users WHERE SHA1(CONCAT('HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`,'10.0.0.1'));
+------+------------+-----------+-----------+
| id   | first_name | last_name | ip        |
+------+------------+-----------+-----------+
|    1 | me         | last      | 127.0.0.1 |
+------+------------+-----------+-----------+