即使在使用 mysqli_real_escape_string 之后,数据库也不允许使用特殊字符
database doesn't allow special chars even after using mysqli_real_escape_string
我在 SO
上发现了很多这样的问题并遵循了解决方案,但在我的情况下没有用。
我想把+
插入数据库,所以我用了
$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);
但这不会插入 +
。它在数据库中给出空 space(whitespace)。
请注意,我正在使用 prepared statement
和 parameterized query
。这是数据库不允许 +
的原因吗?如果是,那么我该如何解决这个问题?
感谢您的宝贵时间。
代码
Javascript
//call con_edi() on first button clicked.insert email on text field and click button would fire off change5()
function con_edi(){
document.getElementById("alu").innerHTML="<input type='text' id='taxi' style='border:1px solid black;'><input type='submit' id='' onclick='change5(taxi.value)' value='change'>";
}
function change5(s){
var form=s;
if(!form.match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/)){
alert("Wrong Email");
}else{
//document.write(form); /*for testing the output*/
var ajax=new XMLHttpRequest();
ajax.open("post","contact.php",true);
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
ajax.onreadystatechange=function(){
if(ajax.readyState == 4 && ajax.status == 200){
location.reload();
}
}
ajax.send("text5="+form);
}
}
PHP
$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);
$query6="UPDATE `$database`.`header` SET email=? WHERE user_id=?";
mysqli_stmt_prepare($stmt1, $query6);
mysqli_stmt_bind_param($stmt1, "si", $tex5, $logged_id);
mysqli_stmt_execute($stmt1);
编辑:看来您在准备好的语句中传递了一个额外的变量,您期望有 2 个变量,但您传递了 3 个,从绑定语句中删除 "si" 应该可以修复它。
mysqli_stmt_bind_param($stmt1, $tex5, $logged_id);
旧答案:我认为之前的答案不正确(抱歉!):
mysqli_real_escape_string()
函数只删除任何特殊字符,这就是它在你的情况下所做的,你应该做的是将这些特殊字符转换为 HTML 具有 htmlentities()
的实体.
$tex5=mysqli_real_escape_string($connect_dude,htmlentities($_POST['text5']));
这会将“+
”转换为“+
”,应该能够将其添加到数据库中。
您需要正确地URL编码您发送的值。
现在,您正在发送 text5=lkf+alu@craftwebart.com
– 在此 URL 上下文中,+
是 space 字符的“替换”字符。这就是为什么您的脚本将 space 字符插入数据库的原因,而不是因为插入数据库本身有问题。 (尽管如前所述,将 mysqli_real_escape_string
与准备好的语句 结合使用是 错误的。mysqli_real_escape_string
用于屏蔽插入到 [=33= 中的特殊字符] 语法,这样它们就不会与实际的 SQL 语法混淆。然而,当使用带占位符的准备语句时,SQL 命令和数据被发送到彼此分开的数据库,因此危险在这种情况下不存在。)
所以,你需要使用
ajax.send("text5="+encodeURIComponent(form));
将您的数据发送到服务器。 encodeURIComponent
负责为 URL 上下文正确编码数据。它会将 +
字符转换为 %2B
,以便它可以在该上下文中安全地发送,并且 PHP 会自动将其解码回 +
。
我在 SO
上发现了很多这样的问题并遵循了解决方案,但在我的情况下没有用。
我想把+
插入数据库,所以我用了
$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);
但这不会插入 +
。它在数据库中给出空 space(whitespace)。
请注意,我正在使用 prepared statement
和 parameterized query
。这是数据库不允许 +
的原因吗?如果是,那么我该如何解决这个问题?
感谢您的宝贵时间。
代码
Javascript
//call con_edi() on first button clicked.insert email on text field and click button would fire off change5()
function con_edi(){
document.getElementById("alu").innerHTML="<input type='text' id='taxi' style='border:1px solid black;'><input type='submit' id='' onclick='change5(taxi.value)' value='change'>";
}
function change5(s){
var form=s;
if(!form.match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/)){
alert("Wrong Email");
}else{
//document.write(form); /*for testing the output*/
var ajax=new XMLHttpRequest();
ajax.open("post","contact.php",true);
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
ajax.onreadystatechange=function(){
if(ajax.readyState == 4 && ajax.status == 200){
location.reload();
}
}
ajax.send("text5="+form);
}
}
PHP
$tex5=mysqli_real_escape_string($connect_dude,$_POST['text5']);
$query6="UPDATE `$database`.`header` SET email=? WHERE user_id=?";
mysqli_stmt_prepare($stmt1, $query6);
mysqli_stmt_bind_param($stmt1, "si", $tex5, $logged_id);
mysqli_stmt_execute($stmt1);
编辑:看来您在准备好的语句中传递了一个额外的变量,您期望有 2 个变量,但您传递了 3 个,从绑定语句中删除 "si" 应该可以修复它。
mysqli_stmt_bind_param($stmt1, $tex5, $logged_id);
旧答案:我认为之前的答案不正确(抱歉!):
mysqli_real_escape_string()
函数只删除任何特殊字符,这就是它在你的情况下所做的,你应该做的是将这些特殊字符转换为 HTML 具有 htmlentities()
的实体.
$tex5=mysqli_real_escape_string($connect_dude,htmlentities($_POST['text5']));
这会将“+
”转换为“+
”,应该能够将其添加到数据库中。
您需要正确地URL编码您发送的值。
现在,您正在发送 text5=lkf+alu@craftwebart.com
– 在此 URL 上下文中,+
是 space 字符的“替换”字符。这就是为什么您的脚本将 space 字符插入数据库的原因,而不是因为插入数据库本身有问题。 (尽管如前所述,将 mysqli_real_escape_string
与准备好的语句 结合使用是 错误的。mysqli_real_escape_string
用于屏蔽插入到 [=33= 中的特殊字符] 语法,这样它们就不会与实际的 SQL 语法混淆。然而,当使用带占位符的准备语句时,SQL 命令和数据被发送到彼此分开的数据库,因此危险在这种情况下不存在。)
所以,你需要使用
ajax.send("text5="+encodeURIComponent(form));
将您的数据发送到服务器。 encodeURIComponent
负责为 URL 上下文正确编码数据。它会将 +
字符转换为 %2B
,以便它可以在该上下文中安全地发送,并且 PHP 会自动将其解码回 +
。