PDO逃脱了斜线

时间:2012-11-16 04:59:23

标签: php mysql date pdo

  

可能重复:
  Convert MMDDYYYY to date for PHP
  PHP mysql insert date format

我使用PDO在我的数据库中插入数据,但是表单中有date,这是代码的一部分:

$name = "John Doe"; // from form
$bdate = 05/13/1989; // from form

$query = "INSERT INTO details (name, bdate) VALUES (:name, :bdate)";
$stmt = $this->handle->prepare($query);
$stmt->bindParam(':name',$name,PDO::PARAM_STR);
$stmt->bindParam(':bdate',$bdate,PDO::PARAM_STR);
$stmt->execute();

运行脚本后,我在日志中遇到此错误: “SQLSTATE [22007]:日期时间格式无效:1292日期值不正确:'05/13/1989'列'bdate'at at第1行“

我的数据库:

+-------+--------------+
| name  | varchar(100) |
+-------+--------------+
| bdate |    date      |
+-------+--------------+

3 个答案:

答案 0 :(得分:3)

MySQL通常需要YYYY-MM-DD格式的日期。最好将你的削减日期转换为。

这不是转义斜杠的问题,因为首先不会转义斜杠。只有可能破坏你的字符串转义的东西才会被改变。显然MYSQL正在获取正确的字符串,但由于格式化问题而拒绝它。

答案 1 :(得分:1)

要在数据库中输入日期,需要YYYY-MM-DD,或者在1989-05-13。只需创建一个以正确顺序交换日期的函数。

function swap_date($date) {
  $newDate = explode("/", $date);
  return "{$newDate[2]}-{$newDate[0]}-{$newDate[1]}";
}

// -------------

$name = "John Doe";
$bdate = swap_date("05/13/1989"); // swap_date($_GET['date']) or whatever you use

$query = "INSERT INTO details (name, bdate) VALUES (:name, :bdate)";
$stmt = $this->handle->prepare($query);
$stmt->bindParam(':name',$name,PDO::PARAM_STR);
$stmt->bindParam(':bdate',$bdate,PDO::PARAM_STR);
$stmt->execute();

答案 2 :(得分:0)

在向数据库插入任何内容之前,最好确保它包含“,/,”之类的字符等等。因此,更好的做法是创建一个添加或条带斜杠的函数,并返回一个无风险的字符串以插入到数据库中。 所以你能做的就是,

$bdate = 05/13/1989;
$bdate = mysql_prep($bdate);

function mysql_prep($value) {
    $magic_quotes_active = get_magic_quotes_gpc();
    $new_enough_php = function_exists("mysql_real_escape_string"); // PHP >= v4.3.0
    if ($new_enough_php) {
        if ($magic_quotes_active) {
            $value = stripslashes($value);
        }
        $value = mysql_real_escape_string($value);
    } else { // before PHP v4.3.0
        if (!$magic_quotes_active) {
            $value = addslashes($value);
        }
    }
    return $value;
}