Datetime NOW 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?

Просто сделайте это:

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

Хотя вы должны иметь правильный тип столбца. date или time одиночку, не будет работать, если я правильно напомню; это должно быть datetime или время?


ПРЕДУПРЕЖДЕНИЕ

mysql_* устарел от PHP 5.5.0 и выше: http://php.net/manual/en/function.mysql-query.php

Вместо этого используйте PDO; см. ответ Стефана Герига.

Поскольку никто прямо не ответил на вопрос (хотя правильный ответ можно извлечь из комментариев к ответу Олли Сондерс ), я добавлю правильный ответ ради полноты.

 $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('Ymd H:i:s'); $stmt->bindParam(':time_added', $date, PDO::PARAM_STR); 

Ни один из ответов не решает вопрос, как я вижу!

Итак, есть некоторые из моих выводов: нет способа заставить PDO передать вызов функции MySQL в качестве значения запроса – так что нет способа сделать простую оболочку, которая сможет использовать NOW () или любую другую функцию, переданную значения. Каждый раз, когда вам нужно что-то подобное, вам нужно вручную изменить запрос, поэтому вызов функции является частью строки запроса. 🙁

Я использую функцию, которая проверяет заданные значения для функции MySQL, которую я использую и модифицирую сам запрос, но это не является хорошим решением для моего мнения …: -}

Это может быть полезно некоторым из вас, возможно, нет. Я столкнулся с той же проблемой, что и Олли Сондерс. Я довольно новичок в 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 (), я также использую столбец типа timestamp и устанавливаю его значение по умолчанию CURRENT_TIMESTAMP .. поэтому я просто ничего не пропускаю для этого поля, и время автоматически устанавливается. возможно, не совсем то, что искали.

Чтобы ответить на вопрос Элмо, вы можете создать оболочку 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); } 

Используйте его так:

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