Php 数据表单的过程脚本-间歇性错误
我已经建立了一个数据表单,在post上运行一个小脚本。它有一个间歇性的错误。该脚本应该将条目记录到数据库中,然后发送一封包含详细信息的电子邮件。我收到100%的电子邮件,但实际上只有90%的条目被记录到数据库中。有人能在这里发现问题、改进或建议吗?谢谢-Php 数据表单的过程脚本-间歇性错误,php,Php,我已经建立了一个数据表单,在post上运行一个小脚本。它有一个间歇性的错误。该脚本应该将条目记录到数据库中,然后发送一封包含详细信息的电子邮件。我收到100%的电子邮件,但实际上只有90%的条目被记录到数据库中。有人能在这里发现问题、改进或建议吗?谢谢- $name=$_POST[name]; $email=$_POST[email]; $state=$_POST[state]; $phone=$_POST[phone]; $comments=$_POST[comments]; $today =
$name=$_POST[name];
$email=$_POST[email];
$state=$_POST[state];
$phone=$_POST[phone];
$comments=$_POST[comments];
$today = date("F j, Y, g:i a");
include("config.php");
$link = mysqli_connect("$db_host" , "$db_user" , "$db_password" , "$db") or die();
mysqli_select_db($link, $db) or die();
mysqli_query($link,"INSERT INTO form (name,email,state,phone,comments,date)
VALUES ('$name','$email','$state','$phone','$comments','$today')");
$Body= " \n";
$Body .= "Contact Request From my_site.com\n\n";
$Body .= "Name: $name\n";
$Body .= "Email: $email\n";
$Body .= "State: $state\n";
$Body .= "Telephone: $phone\n";
$Body .= "Comments: $comments\n";
$Body .= "\n";
mail ("my_email@my_site.com", "Contact Request From my_site.com", $Body, "From: $email");
header("Location: https://www.my_site.com/thank-you/");
die();
解决了
POST值未作为字符串转义。任何包含单个“引号”的值都会结束SQL参数并引发SQL错误,并且实际上会打开一个漏洞(即SQL注入)
修复方法:
$name=$_POST[name];
$email=$_POST[email];
$state=$_POST[state];
$phone=$_POST[phone];
$comments=$_POST[comments];
$today = date("F j, Y, g:i a");
include("config.php");
$link = mysqli_connect("$db_host" , "$db_user" , "$db_password" , "$db") or die();
mysqli_select_db($link, $db) or die();
$name=mysqli_real_escape_string($link, $name);
$email=mysqli_real_escape_string($link, $email) ;
$state=mysqli_real_escape_string($link, $state) ;
$phone=mysqli_real_escape_string($link, $phone) ;
$comments=mysqli_real_escape_string($link, $comments);
您不会检查错误。调用
mysqli\u error()
,谜团就会被解开。我怎么能把错误记录到数据库中供以后查看呢?如前所述,它只会在大约10%的时间内失败。您无法逃避POST参数。如果其中任何一个包含引号,则SQL将出现语法错误。您应该使用bind_param
,如果不使用mysqli_real_escape_string
,请使用mysqli_real_escape_string
。谢谢Barmar,您可以在代码中演示如何执行此操作吗?您应该按照Barmar的建议使用绑定参数,而不要使用转义字符串;这是MySql拥有绑定参数之前的遗留问题。详情如下: