web-dev-qa-db-ja.com

今すぐ日時PHP mysql(+ PDOバリアント)

見てくれてありがとう。役立つ回答/コメントはすべて投票されます。

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ですか?

13
Chris

誰も明確に質問に答えていないので、完全を期すために正解を追加します。

$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
));
53
Stefan Gehrig

PDOステートメントが正しいと仮定すると、次のようなことができます。

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

私が見ているように、答えはどれも質問を解決しません!

だから私の発見のいくつかがあります:MySQL関数呼び出しをクエリ値として渡すようにPDOを強制する方法はありません-したがって、NOW()または渡された他の関数を使用できる単純なラッパーを実行する方法はありません値。このようなものが必要になるたびに、クエリを手動で変更する必要があるため、関数呼び出しはクエリ文字列の一部です。 :-(

私は使用しているMySQL関数の指定された値をテストし、クエリ自体を変更する関数を使用していますが、それは私の意見に対する良い解決策ではありません...:-}

5
B.F.U.

これは、おそらく役に立たない人もいるでしょう。 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();
}

それが機能することを推測してください!ここで助けてくれることを願っています。コメントは大歓迎です。それを試して、それがあなたのためにうまくいったかどうか、または何か追加があるかどうか教えてください。

2
Chris Tailor

nOW()以外は、「タイムスタンプ」タイプの列も使用し、そのデフォルトをCURRENT_TIMESTAMPに設定します。そのため、そのフィールドには何も渡さず、時間が自動的に設定されます。多分あなたが探しているものとは正確には違う。

1
Sabeen Malik

Elmoの質問に答えるには、can NOW()のようなSQL関数を可能にするPDOラッパーを作成します。 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())
1
Andrew Klaassen