2015-04-07 40 views
1

向下滚动以帮助我解决问题。如何在准备好的语句中使用sql函数CONCAT

问题几乎解决!

我试图使用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); 

,并从我的课堂我自动登录方法:

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';”,这是工作。任何想法??

回答

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 | 
+------+------------+-----------+-----------+ 
+0

它不工作,我会更新我的问题带来更多细节 –

+0

hm。你从使用'用户表'到'成员表'。这是什么? –

+0

成员之一,用户来自我找到的网站中的tutoriel,但不错的主意 –

相关问题