2012-02-22 75 views
0

儘管項目已成功添加到數據庫,但我不確定是否正確執行了mysql_real_escape_string()函數,從而導致了錯誤。任何幫助表示讚賞。mysqil_real_escape_string()錯誤我無法修復

成功!

警告:array_map()[function.array映射]:參數#2應在/home/site4/public_html/lab/mailing_list_dev_1-0/mailing_list_add.php陣列上線32個

感謝報名!

這裏是有問題的代碼...

<?php 
// connects the database access information this file 
include("mailing_list_include.php"); 

// the following code relates to mailing list signups only 
if (($_POST) && ($_POST["action"] == "sub")) { 

if ($_POST["email"] == "") { 
     header("Location: mailing_list_add.php"); 
     exit; 
    } else { 
     // connect to database 
     doDB(); 

     // filtering out anything that isn't an email address 
     if (filter_var(($_POST["email"]), FILTER_VALIDATE_EMAIL) == TRUE) { 
      echo 'Success!'; 
     } else { 
      echo 'Invalid Email Address'; 
      exit; 
     } 

     // check that the email is in the database 
     emailChecker($_POST["email"]); 

     // get number of results and do action 
     if (mysqli_num_rows($check_res) < 1) { 
      // free result 
      mysqli_free_result($check_res); 

      // cleans all input variables at once 
      $email = array_map("mysqli_real_escape_string", ($_POST["email"])); 

      // add record 
      $add_sql = "INSERT INTO subscribers (email) 
         VALUES('".$_POST["email"]."')"; 
      $add_res = mysqli_query($mysqli, $add_sql) 
         or die(mysqli_error($mysqli)); 
      $display_block = "<p>Thanks for signing up!</p>"; 

      // close connection to mysql 
      mysqli_close($mysqli); 
     } else { 
      // print failure message 
      $display_block = "You're email address, ".$_POST["email"].", is already subscribed."; 
    } 
} 
} 

?> 
<html> 
<?php echo "$display_block";?> 
</html> 

回答

3

你治療$_POST['email']作爲一個數組,它有可能ins't。

如果你只打算逃跑email,做

$email = mysqli_real_escape_string($dbConn, $_POST['email']); 

然後在你的INSERT語句,使用轉義$email代替$_POST['email']

$add_sql = "INSERT INTO subscribers (email) VALUES('$email')"; 
+0

試過線$電子郵件= mysqli_real_escape_string($ _ POST [「電子郵件」]); ,並得到這個錯誤:「警告:mysqli_real_escape_string()期待恰好2參數,1在/home/site4/public_html/lab/mailing_list_dev_1-0/mailing_list_add.php在32行」 – Andy 2012-02-22 17:24:41

+1

@安迪抱歉,我沒有注意到你正在使用'mysqli'而不是舊的'mysql'函數。您必須傳遞連接到數據庫時創建的鏈接資源。我把'$ dbConn'放進''doDB()'函數內部。 – 2012-02-22 17:27:47

+0

哇,真棒幫助,謝謝。我也有一個類似的腳本來刪除地址,我是否也需要應用相同的過濾器?或者刪除一些不添加任何東西到MySQL所以不能造成任何損害?此外,這足以防止惡意代碼在你看來? – Andy 2012-02-22 17:37:21

2

array_map()是爲數組。如果你只有一個值,那就直接調用該函數。

1

至少有一個錯誤,在這裏:

// Does not work because $_POST["email"] is a string, not an array 
$email = array_map("mysqli_real_escape_string", ($_POST["email"])); 

這看起來像是你從已運行的代碼適應,但現在它壞了。你可能想是這樣的:

$post = array_map("mysqli_real_escape_string", $_POST["email"]); 

後,您可以使用$post["email"]安全,因爲它已經逃走了。

當然逃脫$_POST內的所有內容可能不是最好的方式去做這件事。目前仍然是平凡,但抽查的方式來考慮:

$email = mysqli_real_escape_string($_POST['email']); 
+0

欣賞指導。我確實從其他方面適應了它,只是試圖分解它們,看看它們是如何工作的。 – Andy 2012-02-22 17:51:11

1

這顯然不是mysqli_real_escape_string問題,但array_map()的問題。或者恰恰是濫用後者。

但是,只要解決此問題,您將面臨mysqli_real_escape_string()問題。
爲了解決這個問題,你的doDB()函數必須返回連接ID,你必須使用每個mysqli_ *函數。

$conn = doDB(); 
$email = mysqli_real_escape_string($conn,$_POST["email"]); 

因此你將有你的[上市]解決的問題,但我相信,emailChecker 可能造成同一種不存在$ check_res變量的問題。Instea d其中這樣的功能顯然必須只返回一個布爾和使用等

if (!emailChecker($_POST["email"])) { 
+0

感謝您的有用答案。 – Andy 2012-02-22 17:49:56

相關問題