簡體   English   中英

如何在准備好的語句中使用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;
    }
}

如果您仍然需要更多信息,請問我 ,我會再更新我的問題!


這是最后一個問題

感謝pala_幾乎解決了它

我知道問題出在哪里。 在我的數據庫中,我要登錄的成員的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));

並具有以下輸出:Array

(
    [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 |
+------+------------+-----------+-----------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM