mysqli_real_escape_string在功能上,不起作用?

时间:2013-05-11 17:10:55

标签: php mysql mysqli

我在老师的在线讲座后做了一个函数。但它不起作用,错误信息首先表示存在缺陷。所以我检查了它并且在w3schools上他们说你需要连接作为varibale和字符串。所以我添加了连接,但后来我得到一个错误,说可变的血管未定义。我尝试将函数放在php文档的不同位置,但我不知道如何解决这个问题,PLZ帮助?

我的代码(我删除了我的密码):

<?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>";
?>

2 个答案:

答案 0 :(得分:0)

如果你在脚本的顶部连接,你需要以某种方式将它传递给你的功能。你有两个选择。将其作为函数中的参数。 function reparePostData($value,$dbconn);或者您可以在函数内部声明连接是全局变量,并允许函数在函数global $dbconn;内访问此变量。

答案 1 :(得分:-2)

您正在以错误的方式使用此功能。

mysqli_real_escape_string 与POST数据无关。只有魔法引号。

所以,你必须将这个功能分成两部分:

  1. cleans your POST data from magic quotes
  2. 之一
  3. 产生正确字符串文字的

    function prepareSQLliteral($value)
    {
      if(!is_numeric($value)){
        global $dbConn;
        $value = "'" . mysqli_real_escape_string($dbConn, $value) . "'";
      }
      return $value;
    }
    
  4. 但是,使用手动格式化不是一种方法 相同的处理不是要对全局变量进行,而是对进入查询的非常值进行处理。只有准备好的陈述才能做到。

    但是因为mysqli准备好的语句很不可用,所以你必须使用PDO