如何在准备好的声明中包含冒号?

时间:2011-03-25 09:04:35

标签: php pdo prepared-statement

我有以下查询,当粘贴到SQL客户端时效果很好但在我通过PDO执行它时不起作用。

INSERT INTO mdt_order (`id`,`reference`,`customer_id`,`order_datetime`)
VALUES (NULL,'786d98e7','1960','2011-03-25 08:59:34')

我很确定日期中的:是搞乱的。 order_datetime字段实际设置为2011-03-25 08??

如何在我的PDO查询中包含冒号?

4 个答案:

答案 0 :(得分:2)

太糟糕了,我无法删除此接受的答案。无论如何,这是一个经过编辑的答案:

  

我很确定这是在日期里弄乱了它。

我很确定不是。

但是,要确实确定,必须从PDO获得错误消息

答案 1 :(得分:2)

我从未见过这种行为。 PDO忽略SQL字符串引号中包含的':xyz'语法。你可能有一个错误的版本。

但无论如何,如果你正在使用预准备语句,那么你真的应该使用绑定参数:

$pdo->prepare("INSERT INTO mdt_order (`id`,`reference`,`customer_id`,`order_datetime`) VALUES (?,?,?,?)")
    ->execute(array(NULL, '786d98e7', '1960', '2011-03-25 08:59:34'));

如果您想继续使用原始字符串,请改用->query()。这甚至都不会试图寻找:params,所以避免这样的问题。

答案 2 :(得分:0)

$query = "
    INSERT INTO
        mdt_order (`id`, `reference`, `customer_id`, `order_datetime`)
    VALUES
        (NULL, :reference, :customer_id, :order_datetime)";

$db = new PDO("mssql:host=sqlserver;dbname=database", "username", "password");

$statement = $db->prepare($query);

$parameters = array(
    ":reference" => $reference,
    ":customer_id" => $customer_id,
    ":order_datetime" => $order_datetime
);

$statement->execute($parameters);

答案 3 :(得分:-1)

:xyz是PDO中的命名参数。

这意味着如果您使用pdo->prepare("SELECT :fields FROM :table :where");

你可以statement->execute(array(":fields"=>$fields,":table"=>$table,":where"=>$where));