Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

Просто сделайте следующее:

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

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


Внимание

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

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

Ответ 2

Поскольку никто явно не ответил на вопрос, я добавлю правильный ответ для полноты картины.

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

Ответ 3

Предполагая, что ваша инструкция PDO верна, вы можете сделать что-то вроде этого:

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

Ответ 4

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

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

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

Ответ 5

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

и угадайте, что он работает! Надеюсь, что помогли здесь. Любые комментарии приветствуются. Попробуйте и скажите, работает ли это для вас, или если у вас есть какие-либо дополнения.

Ответ 6

кроме NOW() я также использую столбец типа timestamp и устанавливаю его значение по умолчанию CURRENT_TIMESTAMP.. поэтому я просто ничего не пропускаю для этого поля, и время автоматически устанавливается. возможно, не совсем то, что ищут.

Ответ 7

Чтобы ответить на вопрос Elmo, вы можете создать оболочку PDO, которая позволяет выполнять функции SQL, такие как NOW(). Вам просто нужно передать дополнительный аргумент с столбцами, для которых вы хотите использовать функции SQL. Здесь моя:

function pInsertFunc($action, $table, $values, $sqlfunctions)
{

    global $pdb;

    // There 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())