我正在尝试让我的电子邮件验证工作。只要发送带有哈希链接的电子邮件进行确认,一切都可以,但一旦它转到下面的verify.php链接,它就不会将我的DB活动行从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>';
}
您的代码不正确(使用$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等)。
您应该在if子句中定义$email和$email_hash。
$email = $_GET['email'];
$email_hash = $_GET['email_hash'];
目前,您所依赖的是一个不推荐使用的指令register_globals。
您犯了一些非常明显的错误。首先,你应该打开错误。您必须使用error_reporting(-1)
和ini_set('display_errors', true)
来查看和查找错误。这是至关重要的,否则你将很难找到错误。一旦应用程序处于生产环境中,请确保将其关闭。
在您的特定情况下,if条件不起作用。从不使用变量$search
。您在$database->num_rows($query)
中引用了一个未定义的$query
变量。并且CCD_ 6和CCD_。
请不要使用$email = $_GET['email'];
。你必须净化所有的用户输入,否则你会得到sql注入!
相反,请使用特定于数据库的转义函数或准备好的语句。Mysql->
$email = mysql_real_escape_string($_GET['email']);
where子句数组不正确,应该是
$where_clause = array(
'email' => $_GET['email'],
'email_hash' => $_GET['email_hash'],
'active' => 0 // not 1
);
顺便说一句,您似乎正在使用一些抽象库进行数据库查询——尝试将选择查询更改为使用占位符,并让库为您转义变量。现在,您的代码看起来容易受到SQL注入的攻击。