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

时间:2011-08-06 13:11:48

标签: php mysql

在被告知我必须验证我的表单以便没有人可以破解我的数据库之后我做了一些更改,这些更改添加了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']);

因为这样做,所以没有任何内容被发送到名字姓氏电子邮件,尽管日期似乎正在发送,但

是否有任何可能导致此问题的内容,您可以从我的代码中看到?

3 个答案:

答案 0 :(得分:0)

如果你确定实际设置了这些数据(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']);

使用prepared statements完全可以让你感觉更好,所以你不必担心SQL注入。

另外,我建议你不要在插入查询中使用NULL来获取字段ID。如果你的表是我猜的那么严格,并且ID是AutoIncrement的主键,你不需要在查询中输入它,因为它会被引擎自动填充。

为了更好地使用预准备语句或mysql_real_escape_string(),请检查此资源mysql_real_escape_string vs prepared statements

答案 1 :(得分:0)

Damien建议可能存在丢失数据的问题。建立连接,然后使用mysql_real_escape_string()。部分需要连接,以便mysql_real_escape_string()可以考虑连接的当前字符集。

此外,当与sprintf()函数(full details on sprintf)结合使用时,mysql_real_escape_string()非常安全。使用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.");

答案 2 :(得分:0)

原始查询...

mysql_real_escape_string($new_date)

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

$new_date = $datepicker //  !? :)

以及您的注射问题:

Does mysql_real_escape_string() FULLY protect against SQL injection?