Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据表单的过程脚本-间歇性错误_Php - Fatal编程技术网

Php 数据表单的过程脚本-间歇性错误

Php 数据表单的过程脚本-间歇性错误,php,Php,我已经建立了一个数据表单,在post上运行一个小脚本。它有一个间歇性的错误。该脚本应该将条目记录到数据库中,然后发送一封包含详细信息的电子邮件。我收到100%的电子邮件,但实际上只有90%的条目被记录到数据库中。有人能在这里发现问题、改进或建议吗?谢谢- $name=$_POST[name]; $email=$_POST[email]; $state=$_POST[state]; $phone=$_POST[phone]; $comments=$_POST[comments]; $today =

我已经建立了一个数据表单,在post上运行一个小脚本。它有一个间歇性的错误。该脚本应该将条目记录到数据库中,然后发送一封包含详细信息的电子邮件。我收到100%的电子邮件,但实际上只有90%的条目被记录到数据库中。有人能在这里发现问题、改进或建议吗?谢谢-

$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拥有绑定参数之前的遗留问题。详情如下: