[英]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.