Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime NOW PHP mysql(+;PDO变体)_Php_Mysql_Pdo - Fatal编程技术网

Datetime NOW PHP mysql(+;PDO变体)

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',

谢谢你的关注。所有有帮助的答案/评论都被投票支持

在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', $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年中,我不得不在几十个场合解决这个问题,因为时区不同。