[英]PHP with mysqli_real_escape_string does not work as expected
我正在嘗試創建一個登錄頁面,但是有一個問題,其中數據沒有被發送。 誰能幫我嗎。
$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");
}
我得到的輸出是:test test123 SELECT * FROM login_admin WHERE user_name = \\'\\'和user_pass = SHA1(\\'\\')錯誤的用戶名或密碼。 請重試
您必須提供$ link標識符作為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提供有關原因的信息 。
考慮使用我們喜歡調用的(很棒的) 預備查詢 。
這些很棒,因為它們將數據視為數據,而不是要執行的語句 。 這意味着不需要轉義,因為您的輸入不會被誤解。
要在您的情況下實現此目的:
$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");
}
我還寫了一個工作的管理員控制面板 ,我將其復制粘貼到可以為登錄系統實現幾乎所有功能的東西中(請參閱private.php
)
另外,要回答您的真實問題,在沒有數據庫連接的情況下,沒有辦法在mysqli中進行轉義。 將數據庫添加到函數的開頭:
mysqli_real_escape_string($db, $string);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.