2011-08-06 50 views
0

被告知,我必须验证我的形式,这样没有人可以砍我的数据库,然后我做了一些变化,这是在加入了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']); 

,因为这样做,什么都没有,虽然日期似乎是虽然

OK发送发送到0​​名姓或 电子邮件

是否有任何可能导致您从代码中看到的内容?

+0

检查你使用的是变量的值 - 确保他们实际上在他们的数据。并且不要使用'mysql_real_escape_string'和字符串混搭来玩,它会使代码非常难以阅读。使用[支持参数化的API](http://bobby-tables.com/php.html) – Quentin

+0

您的代码是按照这个顺序吗?在中,首先查询定义 - >然后定义$ firstname,$ lastname?如果是这样,那是你的问题。 – NSSec

回答

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注入。

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

对于wheter它是更好地使用准备好的语句或mysql_escape_string()和检查该资源mysql_real_escape_string vs prepared statements

+0

我只需要这样做: $ query = $ dbh-> prepare(“INSERT INTO allymccoist(id,firstname,lastname,email,date) VALUES('”。$ firstname。“','” 。$ lastname。“','”。$ email。“','”。$ new_date。“')”); – Gezzamondo

+0

我不会建议使用准备好的语句来完成像这个查询这样简单的事情,而且我当然不会建议使用它来简单地避免需要跳过参数 – adlawson

+0

作为即时通讯新的php我有点担心有人用数据库骇客sql injestions ...将方法我当前使用与mysql_real_esape_string()是否足够的保护? – Gezzamondo

0

丢失数据的问题很可能是达米安建议。建立一个连接,然后使用mysql_real_escape_string()。部分连接是必需的,以便mysql_real_escape_string()可以考虑连接的当前字符集。

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

所以对于你的程序代码应该看起来像(注:如达明表明,离开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.");