見てくれてありがとう。役立つ回答/コメントはすべて投票されます。
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ですか?
誰も明確に質問に答えていないので、完全を期すために正解を追加します。
$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ステートメントが正しいと仮定すると、次のようなことができます。
$date = date('Y-m-d H:i:s');
$stmt->bindParam(':time_added', $date, PDO::PARAM_STR);
私が見ているように、答えはどれも質問を解決しません!
だから私の発見のいくつかがあります:MySQL関数呼び出しをクエリ値として渡すようにPDOを強制する方法はありません-したがって、NOW()または渡された他の関数を使用できる単純なラッパーを実行する方法はありません値。このようなものが必要になるたびに、クエリを手動で変更する必要があるため、関数呼び出しはクエリ文字列の一部です。 :-(
私は使用しているMySQL関数の指定された値をテストし、クエリ自体を変更する関数を使用していますが、それは私の意見に対する良い解決策ではありません...:-}
これは、おそらく役に立たない人もいるでしょう。 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(); }
それが機能することを推測してください!ここで助けてくれることを願っています。コメントは大歓迎です。それを試して、それがあなたのためにうまくいったかどうか、または何か追加があるかどうか教えてください。
nOW()以外は、「タイムスタンプ」タイプの列も使用し、そのデフォルトをCURRENT_TIMESTAMPに設定します。そのため、そのフィールドには何も渡さず、時間が自動的に設定されます。多分あなたが探しているものとは正確には違う。
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())