Datetime NOW PHP mysql(+;PDO变体)
谢谢你的关注。所有有帮助的答案/评论都被投票支持 在php中,您可以像这样使用NOW():Datetime NOW PHP mysql(+;PDO变体),php,mysql,pdo,Php,Mysql,Pdo,谢谢你的关注。所有有帮助的答案/评论都被投票支持 在php中,您可以像这样使用NOW(): mysql_query("INSERT INTO tablename (id, value, time_created) VALUES ('{$id}', '{$value}', NOW())"); $date = date('Y-m-d H:i:s'); $stmt->bindParam(':time_added',
mysql_query("INSERT INTO tablename (id, value, time_created)
VALUES ('{$id}', '{$value}', NOW())");
$date = date('Y-m-d H:i:s');
$stmt->bindParam(':time_added', $date, PDO::PARAM_STR);
$values = array(
'ID' => NULL,
'name' => $username,
'address' => $address,
);
$sqlfuncs = array(
'date' => 'NOW()',
);
pInsertFunc("INSERT INTO", "addresses", $values, $sqlfuncs);
INSERT INTO addresses (ID, name, address, date) VALUES (:ID, :name, :address, NOW())
我怎样才能在PDO中做同样的事情。当我这样绑定时,会出现一个错误:
$stmt->bindParam(':time_added', NOW(), PDO::PARAM_STR);
是PDO:PARAM_STR吗?除了现在()我还使用“timestamp”类型列,并将其默认值设置为当前时间戳。。所以我只需对该字段不传递任何内容,时间就会自动设置。可能不完全是你想要的。因为没有人明确回答这个问题,为了完整起见,我将添加正确的答案
$stmt = $pdoDb->prepare('INSERT INTO tablename (id, value, time_created) VALUES (:id, :value, NOW())');
// either bind each parameter explicitly
$stmt->bindParam(':id', $id); // PDOStatement::bindValue() is also possibly
$stmt->bindParam(':value', $value);
$stmt->execute();
// or bind when executing the statement
$stmt->execute(array(
':id' => $id,
':value' => $value
));
在我看来,没有一个答案能解决这个问题 因此,我有一些发现: 没有办法强制PDO将MySQL函数调用作为查询值传递,因此也没有办法进行简单的包装,以便能够使用NOW()或任何其他函数作为传递值。每次需要这样的内容时,都需要手动更改查询,因此函数调用是查询字符串的一部分:-(
我正在使用的函数测试我正在使用的MySQL函数的给定值并修改查询本身,但这不是一个很好的解决方案…:-}这可能对你们中的一些人有用,也许不是。我遇到了与Ollie Saunders相同的问题。我对php/MySQL非常陌生,尤其是PDO。我能够解决这个问题以下问题:
猜猜它能起什么作用!希望能在这里有所帮助。欢迎发表任何评论。尝试一下,告诉我它是否对您有效,或者您是否有任何补充。假设您的PDO声明是正确的,您可以这样做:
mysql_query("INSERT INTO tablename (id, value, time_created)
VALUES ('{$id}', '{$value}', NOW())");
$date = date('Y-m-d H:i:s');
$stmt->bindParam(':time_added', $date, PDO::PARAM_STR);
$values = array(
'ID' => NULL,
'name' => $username,
'address' => $address,
);
$sqlfuncs = array(
'date' => 'NOW()',
);
pInsertFunc("INSERT INTO", "addresses", $values, $sqlfuncs);
INSERT INTO addresses (ID, name, address, date) VALUES (:ID, :name, :address, NOW())
要回答Elmo的问题,您可以创建一个PDO包装器,该包装器允许使用SQL函数,如NOW()。您只需传递一个附加参数,其中包含要使用SQL函数的列。我的示例如下:
function pInsertFunc($action, $table, $values, $sqlfunctions)
{
global $pdb;
// There's no way to pass an SQL function like "NOW()" as a PDO parameter,
// so this function builds the query string with those functions. $values
// and $sqlfunctions should be key => value arrays, with column names
// as keys. The $values values will be passed in as parameters, and the
// $sqlfunction values will be made part of the query string.
$value_columns = array_keys($values);
$sqlfunc_columns = array_keys($sqlfunctions);
$columns = array_merge($value_columns, $sqlfunc_columns);
// Only $values become ':paramname' PDO parameters.
$value_parameters = array_map(function($col) {return (':' . $col);}, $value_columns);
// SQL functions go straight in as strings.
$sqlfunc_parameters = array_values($sqlfunctions);
$parameters = array_merge($value_parameters, $sqlfunc_parameters);
$column_list = join(', ', $columns);
$parameter_list = join(', ', $parameters);
$query = "$action $table ($column_list) VALUES ($parameter_list)";
$stmt = $pdb->prepare($query);
$stmt->execute($values);
}
像这样使用它:
mysql_query("INSERT INTO tablename (id, value, time_created)
VALUES ('{$id}', '{$value}', NOW())");
$date = date('Y-m-d H:i:s');
$stmt->bindParam(':time_added', $date, PDO::PARAM_STR);
$values = array(
'ID' => NULL,
'name' => $username,
'address' => $address,
);
$sqlfuncs = array(
'date' => 'NOW()',
);
pInsertFunc("INSERT INTO", "addresses", $values, $sqlfuncs);
INSERT INTO addresses (ID, name, address, date) VALUES (:ID, :name, :address, NOW())
生成的查询字符串如下所示:
mysql_query("INSERT INTO tablename (id, value, time_created)
VALUES ('{$id}', '{$value}', NOW())");
$date = date('Y-m-d H:i:s');
$stmt->bindParam(':time_added', $date, PDO::PARAM_STR);
$values = array(
'ID' => NULL,
'name' => $username,
'address' => $address,
);
$sqlfuncs = array(
'date' => 'NOW()',
);
pInsertFunc("INSERT INTO", "addresses", $values, $sqlfuncs);
INSERT INTO addresses (ID, name, address, date) VALUES (:ID, :name, :address, NOW())
如何避免绑定变量和令牌数量不匹配的情况?当我尝试此操作时,收到一条错误消息“无效参数编号:绑定变量的数量与令牌的数量不匹配”。我知道这是一篇旧文章,但这是迄今为止我找到的最佳答案:-)这假设运行PHP的应用程序服务器与数据库服务器位于同一时区否?根据经验,使用
date
和strotime
函数读取和写入数据库是个坏主意。它们确实利用了PHP时区设置,并且可以在时间戳到达数据库之前更改它。您可能不会注意到它,除非您查看数据库中的值(例如,使用workbench)。为了避免麻烦,我建议让数据库处理NOW()的设置,并将数据库连接时区和服务器时区设置为UTC。然后,应用程序代码在读取该值时应该从UTC进行任何时区转换。@Angel S.Moreno:它假定没有这种情况。他的“创建时间”是指数据库的创建还是相关记录的创建?对于后者,我建议,如果是这样的话,“创建的时间”在哲学上/实际上是指距离用户及其记录编辑事件“最近”的时间;从这个意义上说,最接近的距离将由他和服务器之间的距离决定,而他不能对此做出任何假设。但是假设它应该是数据库的时间,至少在这个例子中是不正确的。你误解了我。如果您向PHP询问时间,它将使用PHP.ini中的时区,如果您向MySQL询问时间,它将使用MySQL.cnf文件。如果这些时区不一样,你会得到错误的日期。在我从事*nix服务器的18年中,我不得不在几十个场合解决这个问题,因为时区不同。