2012-07-23 90 views
1

如何将(从表单中)的值插入到MySQL日期字段中。我想这样的:如何将HTML输入字段的值插入到MySQL中?

<form action="enviar.php" autocomplete="off" method="post"> 
    <label for="nacimiento" class="youpasswd" data-icon="p"> 
     Fecha de Nacimiento 
    </label> 
    <br> 
    <input id="nacimiento" name="nacimiento" 
      required type="datetime" placeholder="DD/MM/YYYY" /> 
</form> 

enviar.php

$nacimiento= $_POST['nacimiento']; 
mysql_query("INSERT INTO voluntarios(nacimiento) VALUES ('$nacimiento')");` 

这是工作的所有其他领域,但不与日期字段;它是空的。我究竟做错了什么?

谢谢

+6

使用参数化的SQL查询或您_Will_会被黑客入侵。您的网站目前对SQL注入开放。请参阅http://bobby-tables.com/ – Lusitanian 2012-07-23 22:36:00

+1

mysql_函数已弃用(即将来将被删除)。切换到mysqli_或更好,以PDO。减轻你的问题,你确定你的数据库将接受格式为dd/mm/yyyy的日期字符串吗?很可能正确的格式必须是YYYY-MM-DD – fvu 2012-07-23 22:39:05

+0

正如@Lusitanian所述,除非有充分的理由不应该使用参数化查询(例如PDO)。否则,您可以这样做:'$ nacimiento = mysql_real_escape_string($ _ POST ['nacimiento']);' – Andy0708 2012-07-23 22:39:05

回答

4

seem to have problems even getting the value from your input field to the server阅读起来。这需要首先得到解决。 Debugvar_dump)您的$_POST数据并检查发生了什么。如果您需要更多帮助,请致电Provide more code。从你写的内容来看,我不明白,为什么价值不应该发送。

后你有你的日期字符串,convert值的字符串文字格式MySQL recognizes

$mysqldate = date('Y-m-d H:i:s', $phpdate); 

然后使用mysqli_query插入:

mysqli_query(sprintf("INSERT INTO voluntarios(nacimiento) VALUES ('%s')"), 
         mysql_real_escape_string($mysqldate)); 

使用PDO做到这一点:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
$q = $dbh->prepare("INSERT INTO voluntarios(nacimiento) VALUE (:nacimiento)"); 
$q->bindParam(':nacimiento', $mysqldate, PDO::PARAM_STR); 
$success = $q->execute(); 
+0

+1! – 2012-07-23 23:02:02

+0

@Wolfram请检查JSFIDDLE中表单的完整代码。谢谢 – 2012-07-24 14:40:09

+0

做一个var_dump我看到我在变量中有一个错误,这是固定的。现在'$ nacimiento'正在接受日期,我可以将其存储在数据库中。在这个时候,我正在阅读和学习PDO做安全代码。 – 2012-07-24 15:56:26

0

使用STR_TO_DATE将文本转换为有效的日期格式:

STR_TO_DATE('12/15/2008', '%m/%d/%Y'); 
2

尝试和回声$_POST['nacimiento'];,看看它做什么?它似乎也没有发布你的整个SQL查询,也许在查询中有错误?

编辑:您也可以尝试,看看是什么错误使用mysql_ *函数使用mysql_error


下面的代码很容易受到SQL injection

$nacimiento= $_POST['nacimiento']; 
mysql_query("INSERT INTO voluntarios(nacimiento) VALUES ('$nacimiento')");` 

停止,因为他们正在过时。改为使用PHP database objects (PDO),因为PDO允许使用参数绑定来保护您免受sql注入。

您可以使用PDO here

+1

或者使用比PDO简单的mysqli。无论如何,原始的mysql函数都被弃用了。 – Aatch 2012-07-23 22:47:17

+0

正在做echo $ _POST ['nacimiento'];结果是空的 – 2012-07-23 22:50:58

+0

@Aatch - _simpler_只是一个意见问题,但我认为PDO被更广泛地采用,这就是为什么我推荐它:) – Kush 2012-07-23 22:51:08

1

MySQL expec ts YYYY-MM-DD格式的日期文字as explained in the manual。虽然它接受的内容相当宽松,但是您提供的格式不可接受。

你可能会摆脱一些字符串杂耍大概,但请自己帮忙,正确 - 也就是使用PDO prepared statements。您不仅可以轻松推迟日期解析&预先检查到PHP,您的代码将是一个更安全和未来的证明。

的代码看起来像这样,使用元素从你的例子

$stmt = $dbh->prepare("INSERT INTO voluntarios(nacimiento) VALUES (:nacimiento)"); 
$stmt->bindParam(':nacimiento', $nacimiento); 
// WARNING - strtotime strtotime expects '-' separators if you feed it dd-mm-yyyy 
// you should modify that in your form. 
$nacimiento = strtotime($_POST['nacimiento']); 
$stmt->execute(); 
1

你的问题很可能是日期需要被格式化成SQL标准(YYYY-MM-DD)。如果你想确保格式,那么你可以使用类似这样

$formatted_date = date('Y-m-d',strtotime($_POST['nacimiento'])); 

如果你是用什么将来到您在POST相当有信心,那么你可以使用这个

preg_match('#^(\d{1,2})/(\d{1,2})/(\d{4})$#', $_POST['nacimiento'], $matches); 
if(count($matches)) 
{ 
    $formatted_date = $matches[3].'-'.str_pad($matches[1],2,0,STR_PAD_LEFT).'-'.str_pad($matches[2],2,0,STR_PAD_LEFT); 
    // Use formatted date in query 
} 
else // handle error 
相关问题