PHP sql选择查询问题

PHP sql选择查询问题,php,sql,Php,Sql,我想在php中创建一个帐户激活页面。我试过使用这些代码,但每次都显示出来 您的验证链接无效或已过期 每当电子邮件id和密钥在我的sql数据库中时,我的代码有什么问题?请帮忙 <?php $hash = $_GET['hash']; $e = base64_decode($_GET['e']); ?> <?php require_once("Connections.php");?> <?php mysql_select_db($databa

我想在php中创建一个帐户激活页面。我试过使用这些代码,但每次都显示出来

您的验证链接无效或已过期

每当电子邮件id和密钥在我的sql数据库中时,我的代码有什么问题?请帮忙

<?php 
    $hash = $_GET['hash'];
    $e = base64_decode($_GET['e']);
?>
<?php require_once("Connections.php");?>
<?php 
    mysql_select_db($database, $connection);
    $sql=mysql_query("SELECT FROM temp  WHERE email='$e' AND hashkey='$hash'");

    if(mysql_num_rows($sql)!=1) {
        echo "Your verification link is invalid or expired";
    }
    else {
        if ($sql=mysql_query("DELETE FROM temp  WHERE email='".$e."' AND hashkey='".$hash."'")) {
            echo '<script type="text/javascript">
                  register_2($e);
                  function register_2(){
                      alert("Hi your email"+m);
                  }
                  </script>
                 ';
        }
    }    
?>


你应该使用这样的条件

if(mysql\u num\u rows($sql)!=NULL)
{
echo“您的验证链接无效或已过期”;
}


<?php 
$hash = $_GET['hash'];

$e = base64_decode($_GET['e']);

?>


<?php require_once("Connections.php");?>
<?php 
mysql_select_db($database, $connection);
$sql=mysql_query("SELECT FROM temp  WHERE email='$e' AND hashkey='$hash'");
 if(mysql_num_rows($sql)<= 0)
   {
    echo "Your verification link is invalid or expired";
   }
else{
if ($sql=mysql_query("DELETE FROM temp  WHERE email='".$e."' AND hashkey='".$hash."'")){
        echo '<script type="text/javascript">
                    register_2($e);
                    function register_2(){
                        alert("Hi your email"+m);
                        }
              </script>
              ';
        }
    }

?>

首先,不要使用mysql_*函数,因为它们在PHP7中已被取消访问和删除,请改用mysqli_*或pdo

所以改变

if(mysql_num_rows($sql)!=1)

此外,您的代码容易受到SQL注入的攻击,您应该转义哈希,还应该转义XSS
在这里,我可以通过URL传递base64中编码的任何内容

$hash = mysql_real_escape_string($_GET['hash']);
还有这个代码

mysql_query("DELETE FROM temp  WHERE email='".$e."' AND hashkey='".$hash."'")
可以改为

mysql_query("DELETE FROM temp  WHERE email='$e' AND hashkey='$hash'")
这是一样的,但在最好的情况下,你应该使用事先准备好的语句

其他建议:

  • 变回声为死亡
  • 执行1时删除else条件
  • 您的else条件不检查查询是否确实删除了行。它只检查查询是否已执行,您应该使用
    mysql\u infected\u rows()
    检查行是否已删除或删除此if条件

  • 可能是SELECT查询返回多行。检查一下。
    $e
    $hash
    变量来自哪里?$e和$hash来自GET methode“选择id,smt from”而不是“SELECT from”。您也对一个“现在”敞开了大门,每当我做出<0
    mysql_query("DELETE FROM temp  WHERE email='$e' AND hashkey='$hash'")