2013-02-01 138 views
0

我正在尝试创建一个登录页面,但是我有一个数据未被发送的问题。谁能帮我吗。带mysqli_real_escape_string的PHP不能正常工作

$myusername = stripslashes($username); 
    $mypassword = stripslashes($password); 
    $myusername = mysqli_real_escape_string($myusername); 
    $mypassword = mysqli_real_escape_string($mypassword); 

    $sql="SELECT * FROM login_admin WHERE user_name='$myusername' and user_pass=SHA1('$mypassword')"; 
    $result=mysql_query($dbC, $sql); 
    // Mysql_num_row is counting table row 
    $count=mysql_num_rows($result); 
    // If result matched $myusername and $mypassword, table row must be 1 row 
    if($count==1){ 
     // Register $myusername, $mypassword and redirect to file "admin.php" 
     session_register("admin"); 
     session_register("password"); 
     $_SESSION['name']= $myusername; 
     header("location:admin.php"); 
    } 
    else { 

     $msg = "$username $password $myusername $mypassword $sql $result Wrong Username or Password. Please retry"; 
     header("location:login.php?msg=$msg"); 
    } 

和输出我得到的是: 测试test123 SELECT * FROM login_admin其中用户名= \ '\' 和user_pass = SHA1(\ '\')错误的用户名或密码。请重试

+1

'mysqli'也准备了语句,我建议你使用它们。 –

+0

和我一样,@Jack。因此转义出错很多,所以最简单的做法就是不需要它,并且使SQL引擎更加智能化(即,在api中使用'Prepare'语句而不是'Query') – Amelia

回答

0

你必须mysqli_real_escape_string提供一个$链接标识作为第一个参数,因此这些线路应该看起来更像

$myusername = mysqli_real_escape_string($dbconn,$myusername); 
$mypassword = mysqli_real_escape_string($dbconn,$mypassword); 

其中$ dbconn是你从mysqli_connect背面的链接。如果您要切换到mysqli_ *函数集,您也应该使用mysql_query和mysql_num_rows,当您使用它们的mysqli_等价物时。

我强烈建议使用(现在的遗留)mysql函数切换到mysqli(或PDO)。关于为什么PHP.net提供了information

0

考虑使用我们喜欢称之为(精彩)的东西prepared queries
这些都很好,因为他们将数据视为数据,而不是作为要执行的语句。这意味着不需要转义,因为您的输入不会被误解。

要在您的情况下实现这一点:

$sql = "SELECT user_name FROM login_admin WHERE user_name = ? AND user_pass = SHA1(?)"; 
if ($query = $db->prepare($sql)) { //returns false if incorrect syntax, error, etc. 
    $query->bind_param("ss", $user, $pass); 
    // ss = string, string 
    // mixed bind_param($params, **args); 
    $query->execute(); 
    $query->bind_result($u); 
    $query->fetch(); 
    $query->close(); 
} else { 
    /* error handling */ 
} 
if ($u) { 
    /* session setting */ 
    header("Location: admin.php"); 
} else { 
    header("Location: login.php?e=1"); 
} 

我也有一个工作admin control panel我写,我复制粘贴到的东西,对于一个登录系统实现了很多漂亮的事(见private.php

另外,为了回答你真正的问题,没有这种方法可以在没有数据库连接的情况下在mysqli中进行转义。将你的数据库添加到函数的开始处:

mysqli_real_escape_string($db, $string);