【问题标题】:Datetime NOW PHP mysql (+ PDO variant)现在日期时间 PHP mysql(+ PDO 变体)
【发布时间】:2010-12-07 05:32:53
【问题描述】:

感谢收看。所有有用的答案/cmets 都投了赞成票。

在 php 中,您可以像这样使用 NOW():

mysql_query("INSERT INTO tablename (id,      value,      time_created) 
                            VALUES ('{$id}', '{$value}', NOW())");

我怎样才能在 PDO 中做同样的事情。当我像这样绑定时,我得到一个错误:

$stmt->bindParam(':time_added', NOW(), PDO::PARAM_STR);

是 PDO:PARAM_STR 吗?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    由于没有人明确回答问题,为了完整起见,我将添加正确答案。

    $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
    ));
    

    【讨论】:

    • 如何解决绑定变量和令牌数量不匹配的问题?当我尝试这个时,我收到一条错误消息“无效的参数号:绑定变量的数量与令牌的数量不匹配”。我知道这是一个旧帖子,但这是我迄今为止找到的最佳答案:-)
    【解决方案2】:

    要回答 Elmo 的问题,您可以创建一个 PDO 包装器,该包装器允许像 NOW() 这样的 SQL 函数。您只需要传递一个附加参数以及要使用 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);
    
    }
    

    像这样使用它:

    $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())
    

    【讨论】:

      【解决方案3】:

      这可能对你们中的一些人有用,也许没有。我遇到了和 Ollie Saunders 一样的问题。我对 php/mysql 很陌生,最重要的是 PDO。我能够通过以下方式解决问题:

      $active = 0;      
      $id = NULL;
      $query = "INSERT 
              INTO tbl_user(ID_user, firstname, lastname, email, password, active, create_date)
              VALUES (?,?,?,?,?,?,NOW())";
      
      if($stmt=$this->conn->prepare($query)) {
      $stmt->bind_param('issssi', $id, $firstname, $lastname, $email, $password, $active);
      $stmt->execute();
      }
      

      猜猜它的作用!希望在这里有所帮助。欢迎任何cmets。试试看,告诉我它是否对你有用,或者你有什么补充。

      【讨论】:

        【解决方案4】:

        假设您的 PDO 语句是正确的,您可以执行以下操作:

        $date = date('Y-m-d H:i:s');
        $stmt->bindParam(':time_added', $date, PDO::PARAM_STR);
        

        【讨论】:

        • 这假设您运行 PHP 的应用服务器与您的数据库服务器处于同一时区?
        • 从经验上讲,使用datestrtotime 函数读写数据库是个坏主意。他们确实利用了 PHP 时区设置,并且可以在时间戳进入数据库之前更改它。除非您查看数据库中的值(例如使用工作台),否则您可能不会注意到它。为避免头疼,我建议让数据库处理 NOW() 的设置,并将数据库连接时区和服务器时区设置为 UTC。然后,应用程序代码应在读取值时从 UTC 进行任何时区转换。
        • @Angel S. Moreno:假设没有这样的事情。他的“time_created”是指数据库的创建,还是相关记录的创建?我建议后者,如果是这样,从哲学/实践上讲,“时间创建”是指“最接近”用户及其记录编辑事件的时间;从这个意义上说,最接近的将取决于他与服务器之间的距离,他无法对此做出任何假设。但是假设它应该是数据库的时间,至少在这个例子中是不正确的。
        • 你误解了我的意思。如果您询问 PHP 时间,它将使用 php.ini 中的时区,如果您询问 MySQL 时间,它将使用 mysql.cnf 文件。如果这些时区不同,您将得到错误的日期。在我从事 *nix 服务器的 18 年中,由于时区不同,我不得不多次解决这个问题。
        【解决方案5】:

        在我看来,没有一个答案能解决这个问题!

        所以有一些我的发现: 没有办法强制 PDO 将 MySQL 函数调用作为查询值传递 - 所以没有办法做简单的包装器,它能够使用 NOW() 或任何其他函数作为传递的值。每次您需要类似的东西时,您都需要手动更改查询,因此函数调用是查询字符串的一部分。 :-(

        我正在使用一个函数来测试我正在使用的 MySQL 函数的给定值并修改查询本身,但我认为这不是一个好的解决方案... :-}

        【讨论】:

          【解决方案6】:

          除了 NOW() 之外,我还使用“timestamp”类型列并将其默认设置为 CURRENT_TIMESTAMP .. 所以我只为该字段传递任何内容并自动设置时间。也许不是你想要的。

          【讨论】:

            猜你喜欢
            • 2021-12-06
            • 1970-01-01
            • 1970-01-01
            • 2011-06-12
            • 2013-06-16
            • 2011-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多