如何将 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
来自我的 class,写得很好,不用担心。问题来自这里:
$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);
和我的 class 中的自动登录方法:
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));
并有以下输出:
数组
(
[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 |
+------+------------+-----------+-----------+
向下滚动以帮助我,问题已得到解释。
问题几乎解决了!
我正在尝试使用 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
来自我的 class,写得很好,不用担心。问题来自这里:
$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);
和我的 class 中的自动登录方法:
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));
并有以下输出: 数组
(
[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 |
+------+------------+-----------+-----------+