【问题标题】:How to INSERT multiple HTML form fields into a single MySQL column as date如何将多个 HTML 表单字段作为日期插入单个 MySQL 列
【发布时间】:2012-04-18 05:34:35
【问题描述】:

问题:

我无法找到与我的情况相关的文档或相关答案。

基本上,我想通过使用多个 html 表单下拉字段来生成一个 MySQL 就绪日期以供插入。

目前我的插入代码使用单个字段作为日期,我在 MySQL 格式的文本字段中手动输入:

$sql=
    " INSERT INTO events (e_date, e_time, e_ampm, e_type, e_name) " .
    " VALUES ('{$form_e_date}','{$form_e_time}', '{$form_e_ampm}', '{$form_e_type}','{$form_e_name}')";

我想使用 3 个单独的表单字段(例如 $month、$day、$year)而不是 $form_e_date(我目前使用格式 YYYY-MM-DD 在文本字段中输入),并从下拉选择中选择值盒子。

问题:

有没有一种方法可以连接 3 个变量($year、$month、$day,在 MySQL 中用“-”表示)来代替 $form_e_date,如果可以,您将如何构造这个语法?

我也愿意以更好的方式来解决这个问题(仍然使用 MySQL/PHP);我只需要帮助或指导资源。

非常感谢任何帮助!

附加信息:

附:当前语法是

VALUES ('{$form_e_date}','{$form_e_time}', ... etc.

而不是

VALUES ('$_POST[form_e_date]','$_POST[form_e_time]', ... etc.

作为我收到的未定义索引通知的 PHP 修复的一部分。

还有解决办法

$form_e_date= $_POST['year'] . "-" . $_POST['month'] . "-" . $_POST['day'];

对我来说并不可取,因为它会在新的年、月和日变量上导致未定义的索引通知,即使它们是使用一种可以消除未定义索引通知的技术预先定义的,例如:

if (array_key_exists("year", $_POST))
                $year = mysql_real_escape_string($_POST["year"]);
            else
                $year = null;

代码#abc(用于评论 JT Smith 的回答):

$month = $_POST['month'];
$day = $_POST['day'];
$year = $_POST['year'];

$whole_date = array($year, $month, $day);
$mysql_formatted_date = implode("-", $whole_date);


$sql=
" INSERT INTO events (e_date, e_time, e_ampm, e_type, e_name) " .
" VALUES ('{$mysql_formatted_date}','{$form_e_time}', '{$form_e_ampm}', '{$form_e_type}','{$form_e_name}')";

代码#fgh:

<select name="month">
    <option value="01">Jan</option>
<option value="02">Feb</option>
<option value="03">Mar</option>
<option value="04">Apr</option>
<option value="05">May</option>
<option value="06">Jun</option>
<option value="07">Jul</option>
<option value="08">Aug</option>
<option value="09">Sep</option>
<option value="10">Oct</option>
<option value="11">Nov</option>
<option value="12">Dec</option>
</select>

<select name="day">
    <?php
    for ($i = 1; $i <=31; $i++) {
        echo "<option value=\"$i\">$i</option>";
    }
?>
</select>

<select name="year">
    <option value="2012">2012</option>
    <option value="2013">2013</option>
</select>

【问题讨论】:

  • $year.'-'.$month.'-'.$day?此外,直接在查询中输入变量既不好又危险,请检查PDO 和参数
  • 感谢您的建议。在这一点上,我并不担心注射,因为我正在本地开发,而且我是唯一使用它的人。虽然我不认为在我的情况下这会特别危险,因为该字段是从选择下拉列表中发布的,而不是文本输入。我也会研究 PDO,尽管我认为现阶段这对我来说可能有点先进。
  • PDO其实很简单,用过几次就喜欢上了。对于 SQL 注入,是否有选择或任何其他输入数据的方式并不重要。即使不打开页面也可以发送数据。即使对于本地页面,尝试阻止它也是一种好习惯
  • 问题更新:经过进一步调查,我发现这个问题link 似乎在做我想做的事情,但我尝试了这个,但它仍然没有在我的 e_date 中插入任何内容列(作为日期类型,它仍然插入 0000-00-00;作为 varchar 它插入空)。

标签: php mysql forms


【解决方案1】:

根据您的要求将它们连接到 php 中,或者您也可以使用 mysql concat 函数

【讨论】:

  • 我不清楚这将如何出现在 MySQL 中,尤其是在 {} 花括号内和周围。
  • 你介意告诉我如何在 VALUES 行上合并 MySQL CONCAT_WS() 来连接 $year、$month 和 $date 来代替当前的 $form_e_date 吗?我在处理包含所有大括号、括号和单引号的语法时遇到了麻烦,我无疑需要这些语法来执行此操作?
【解决方案2】:

为什么需要在 mysql 查询中连接它?为什么不直接将其连接到一个变量中并在查询中使用该变量(就像您现在所做的那样)?

$new_date = $_POST['year'] . "-" . $_POST['month'] . "-" . $_POST['day'];

$query = " INSERT INTO events (e_date, e_time, e_ampm, e_type, e_name) " .
" VALUES ('{$new_date}','{$form_e_time}', '{$form_e_ampm}', '{$form_e_type}','{$form_e_name}')";

【讨论】:

  • 我在发布我的问题之前尝试过这种方式,但我遇到的问题是年、月和日变量上的未定义索引通知,即使我事先使用if (array_key_exists("year", $_POST)) $year = mysql_real_escape_string($_POST["year"]); else $year = null; 定义了它们
  • 此日期字段在 MySQL 中的字段是 date 还是您将其设置为 VARCHAR?如果您将其设置为DATE,则可以,使用此方法会出错。我将DATE 字段设置为VARCHAR。更容易使用,唯一的缺点是您无法像使用正常日期那样计算字段记录,但是如果您需要计算中的时间/日期差异,可以通过一些更好的函数来完成。
  • 是的 MySQL 是一个日期日期,但我不明白这对通知有什么影响,因为未定义索引通知是由 PHP 在发送之前在页面上生成的(或在任何字段完成之前,就此而言)。出于计算原因,我确实需要它作为日期。我发现了 MySQL CONCAT_WS() 并且我正在尝试以这种方式解决它,否则我最终会以某种方式解决。不过,感谢您的帮助。
  • 我能够使用 array() 和 implode() 来处理未定义的索引通知,但现在我发现这个连接的日期实际上并没有插入到它的 db 列中(尽管确实插入了其他单个字段值)。这是否表明表单存在问题?
  • 新查询是什么样的?如果除日期之外的其他所有内容都可以正常插入,则很可能不是表单,而是保存日期的变量或查询。你是怎么改日期的?就像我/我们建议的那样?如果是这样,您是否将 db 字段的“类型”从 DATE 更改为 VARCHAR
【解决方案3】:

PHP 中的连接运算符是一个点 . 语法如下:

$date = $year . '-' . $month . '-' . $day;

无论如何,更好的方法是将日期/时间存储在 datetime 类型的单个 db 字段中。检查date() function 和可用格式的文档。

【讨论】:

  • 我会更多地考虑将它们全部组合到一个字段中(我知道这是首选),但首先我需要弄清楚如何使用 1.) MySQL 而不是 PHP 或 2 来连接字段。 ) PHP 不会在 3 个新变量上给我未定义的索引通知,即使我先定义它们。
  • strtotime() php.net/manual/en/function.strtotime.phpdate() php.net/manual/en/function.date.php 的组合可能会成功
  • @ben,你介意告诉我这会是什么样子吗?我还不熟悉使用 strtotime() 函数,更不用说将它与另一个函数结合使用了。
  • @Joshua 它看起来像这样:date("Y-m-d H:i:s",strtotime("$year-$month-$day")); 但如果你把它扔掉 null 变量,你仍然会陷入困境!
  • 但老实说并不比"$year-$month-$day"."00:00:00"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2012-11-14
  • 2011-03-22
  • 2019-08-21
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多