簡體   English   中英

函數中的mysqli_real_escape_string,不起作用?

[英]mysqli_real_escape_string in function, not working?

我按照老師在網上講課的方式制作了函數。 但是它不起作用,該錯誤消息首先說存在一個變量缺失。 所以我檢查了一下,在w3schools上,他們說您需要連接為varibale和字符串。 所以我添加了連接,但是隨后出現一個錯誤,指出未定義的vas。 我試着將函數放在php文檔的不同位置,但是我不知道如何解決這個問題,請幫助?

我的代碼(我刪除了密碼):

<?php

// A function to help prevent SQL Injection.
function preparePostData($value)
{
// Removes slashes (/) if the server automaticlly adds them.
if(get_magic_quotes_gpc()){
$value = stripslashes($value);
}

/* Adds quote marks if the value is not numeric or a numeric string. 
mysqli_real_escape_string adds slashes (/) if there is any character thats not allowed 
and then the text string will not be processed in MySQL. */
if(!is_numeric($value)){
$value = "'" . mysqli_real_escape_string($dbConn, $value) . "'";
}

return $value;
}

// If the submit button is set do this..
if(isset($_POST['saveNews'])){

// Connection to db
$dbConn = mysqli_connect("localhost","sabe0011","password","sabe0011");

// Check connection
if(mysqli_connect_errno($dbConn)){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// SQL question
$insertSQL = "INSERT INTO News (NewsId, Headline, News, Date) VALUES ('NULL',".preparePostData($_POST['newsHeader']).",".preparePostData($_POST['news']).",".preparePostData($_POST['newsDate']).");";

if(mysqli_query($dbConn, $insertSQL)){
echo "Nyheter har sparats";
}

else{
echo "Följande fel uppstod " . mysqli_error() . ".";
}
}

// Connection to db
$dbConn = mysqli_connect("localhost","sabe0011","password","sabe0011");

$dbConn->set_charset("utf8");

// Check connection
if(mysqli_connect_errno($dbConn)){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$newsSQL = mysqli_query($dbConn,"SELECT * FROM News ORDER BY Date;");

echo "<div>";

if(mysqli_num_rows($newsSQL) > 0)
{   
while($rowNews = mysqli_fetch_array($newsSQL)){
echo '<h2>' . $rowNews["Headline"] . '</h2>' . '<time>' . $rowNews["Date"] . '</time>' . '<p>' . $rowNews["News"] . '</p>';
}
}

else{
echo "Inga nyheter hittades";
}

echo "</div>";
?>

如果您在腳本的頂部進行連接,則需要以某種方式將其傳遞給您的函數。 您有兩個選擇。 在您的函數中將其設為參數。 function reparePostData($value,$dbconn); 或者,您可以在函數內部將連接聲明為全局變量,並允許函數在global $dbconn;函數內部訪問此變量global $dbconn;

您使用此功能的方式錯誤。

mysqli_real_escape_string 與POST數據無關 只有魔術引號可以。

因此,您必須將此函數分為兩個部分:

  1. 一種可以從魔術引號中清除POST數據
  2. 一個產生正確的字符串文字的

     function prepareSQLliteral($value) { if(!is_numeric($value)){ global $dbConn; $value = "'" . mysqli_real_escape_string($dbConn, $value) . "'"; } return $value; } 

但是,使用手動格式不是可行的方法。
不必對全局變量執行相同的處理,而要對要查詢的值進行相同的處理。 而且只有准備好的語句才能做到這一點。

但是由於mysqli准備好的語句非常不可用,因此必須使用PDO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM