我正在尝试让我的电子邮件验证工作。一切正常,只要发送带有哈希链接的电子邮件进行确认,但一旦进入下面的verify.php链接,它就不会将我的数据库活动行从0更新为1.有任何建议吗?
if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){
// Verify data
$search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'";
$match = $database->num_rows( $query );
if($match > 0){
//Fields and values to update
$update = array(
'active' => 1
);
//Add the WHERE clauses
$where_clause = array(
'email' => '$email',
'email_hash' => '$email_hash',
'active' => '1'
);
$updated = $database->update( 'users', $update, $where_clause, 1 );
if( $updated )
{
echo '<p>Your account has been activated, you can now login</p>';
}
}
}else{
echo '<p>Your account is already activated</p>';
}
答案 0 :(得分:1)
您的代码不正确(使用$ email / $ email_hash但未声明)这就是它的工作原理:
if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){
// Verify data
$email = $_GET['email'];
$email_hash= $_GET['email_hash'];
$search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'";
$match = $database->num_rows( $query );
if($match > 0){
//Fields and values to update
$update = array(
'active' => 1
);
//Add the WHERE clauses
$where_clause = array(
'email' => '$email',
'email_hash' => '$email_hash',
'active' => '1'
);
$updated = $database->update( 'users', $update, $where_clause, 1 );
if( $updated )
{
echo '<p>Your account has been activated, you can now login</p>';
}
}
}else{
echo '<p>Your account is already activated</p>';
}
我想补充一点,在生产阶段,你必须转义并验证所有传入的数据(POST,GET等)。
答案 1 :(得分:1)
您应该在if子句中定义$ email和$ email_hash。
$email = $_GET['email'];
$email_hash = $_GET['email_hash'];
目前,您依赖于一个名为register_globals的弃用指令。
答案 2 :(得分:1)
error_reporting(-1)
和ini_set('display_errors', true)
来查看和查找错误。这是必不可少的,否则你将很难找到错误。
确保在应用程序处于生产环境后将其关闭。
在您的具体情况下,if条件不起作用。永远不会使用变量$search
。您在$query
中引用了未定义的$database->num_rows($query)
变量。
$email
和$email_hash
未定义。
请不要使用 $email = $_GET['email'];
。您必须清理所有用户输入,否则您将获得sql注入!
而是使用特定于数据库的转义函数或预处理语句。 Mysql-&GT;
$email = mysql_real_escape_string($_GET['email']);
答案 3 :(得分:0)
你的where子句数组不好,应该是
$where_clause = array(
'email' => $_GET['email'],
'email_hash' => $_GET['email_hash'],
'active' => 0 // not 1
);
顺便说一句,您似乎正在使用一些抽象库进行数据库查询 - 尝试更改您的选择查询以使用占位符并让库为您转义变量。现在您的代码看起来容易受到SQL Incjections的攻击。</ p>