表单正在向数据库提交空值


Form is submitting empty values to database

被告知我必须验证我的表单,以便没有人可以破解我的数据库,然后我做了一些更改,其中添加了mysql_real_string()

$query="INSERT INTO allymccoist (id, firstname, lastname, email, date) 
VALUES (NULL, '".$firstname."', '".$lastname."', '".$email."',   '".mysql_real_escape_string($new_date)."')";

$firstname = mysql_real_escape_string($_POST['firstname']);
$lastname = mysql_real_escape_string($_POST['lastname']);
$email = mysql_real_escape_string($_POST['email']);
$datepicker = mysql_real_escape_string($_POST['date']);

由于这样做,没有任何东西被发送到firstname lastname电子邮件,尽管日期似乎通过

发送正常

是否有任何可能导致这一点,你可以看到从我的代码?

如果您确定这些数据实际上已经设置(var_dump您的$_POST数组来检查),那么在使用mysql_real_escape_string()之前,请确保您有一个活动的连接,否则它将返回FALSE:

使用mysql_real_escape_string()之前需要MySQL连接否则生成E_WARNING级别的错误,FALSE为返回。如果没有定义link_identifier,最后一个MySQL连接使用。

所以你可以在每个值中输入FALSE

$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')or die(mysql_error());
mysql_select_db('database_name', $link) or die('cannot select database '.mysql_error());
$firstname = mysql_real_escape_string($_POST['firstname']);
$lastname = mysql_real_escape_string($_POST['lastname']);
$email = mysql_real_escape_string($_POST['email']);
$datepicker = mysql_real_escape_string($_POST['date']);

你会更好地使用准备语句,所以你不必担心SQL注入。

另外,我建议您不要在字段ID的插入查询中使用NULL。如果您的表是结构化的,并且ID是AutoIncrement的主键,则不需要在查询中输入它,因为它将由引擎自动填充。

对于使用准备好的语句还是mysql_real_escape_string()更好,请检查这个资源mysql_real_escape_string vs准备好的语句

丢失数据的问题很可能如Damien所建议的那样。建立连接,然后使用mysql_real_escape_string()。连接在某种程度上是必需的,这样mysql_real_escape_string()就可以考虑连接的当前字符集。

另外,mysql_real_escape_string()与sprintf()函数结合使用时是完全安全的(关于sprintf的详细信息)。使用sprintf()最重要的是设置正确的类型说明符,以便正确转换值。通常,对于整数,您将使用%d。对于浮点数使用%f。对于字符串和日期值使用%s。

因此,对于您的程序,代码应该看起来像(注意:正如Damien建议的那样,将id排除在查询之外):
   /* Read form data. */
   $firstName = $_POST['firstname'];
   $lastName = $_POST['lastname'];
   $email = $_POST['email'];
   $date = $_POST['date']);
   /* Your form validation code here. */ 
   /* Your db connection code here. */
   /* Setup and run your query. */
   $query = sprintf("INSERT INTO allymccoist (firstname, lastname, email, date) 
            VALUES ('%s', '%s', '%s',   '%s')", 
            mysql_real_escape_string($firstName), 
            mysql_real_escape_string($lastName), 
            mysql_real_escape_string($email), 
            mysql_real_escape_string($date));
    $result = mysql_query($query);
    /* Check for errors with query execution. */
    if (!$result) echo("Query Error! Process aborted.");