2009-10-15 33 views
12

Gracias por mirar. Todas las respuestas/comentarios útiles han sido votados.Fecha y hora PHP PHP mysql (+ variante PDO)

en PHP, puede utilizar NOW() así:

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

¿Cómo puedo hacer la misma cosa en DOP. Cuando ato como este, me sale un error:

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

¿Es la DOP: PARAM_STR?

Respuesta

-11

Sólo hacer esto:

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

A pesar de que tiene que tener el tipo de columna de la derecha. date o time solo, no funcionará si recuerdo correctamente; tiene que ser datetime o quizás timestamp?


ADVERTENCIA

mysql_* es obsoleto desde PHP 5.5.0 y hasta: http://php.net/manual/en/function.mysql-query.php

Utilice DOP lugar; ver la respuesta de Stefan Gehrig.

+1

correcta, y el mismo principio se aplica cuando al portar a DOP –

+0

I parece que está obteniendo un error en PDO aunque cuando hago esto: '$ stmt-> bindParam (': time_added', NOW(), PDO :: PARAM_STR);' ¿Es el PDO: PARAM_STR? – Chris

+0

@Ollie +1 para la parte mysql. Ahora estoy atrapado con la parte PDO. – Chris

1

que no sea NOW() también utilizo la columna del tipo "timestamp" y establezco su valor predeterminado en CURRENT_TIMESTAMP .. por lo tanto, no transfiero nada para ese campo y el tiempo se establece automáticamente. tal vez no sea exactamente lo que estás buscando.

48

Dado que nadie ha respondido explícitamente la pregunta (aunque se puede extraer la respuesta correcta de los comentarios al Ollie Saunders's answer), añadiré la respuesta correcta para completar.

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

¿Cómo solucionaría un número no coincidente de variables y tokens vinculados? Cuando probé esto, recibí un mensaje de error 'Número de parámetro inválido: el número de variables enlazadas no coincide con el número de tokens'. Sé que esta es una publicación antigua, pero es la mejor respuesta que he encontrado hasta ahora :-) –

4

¡Ninguna de las respuestas resuelve la pregunta como yo lo veo!

Así que hay algunos de mis hallazgos: no hay FORMA de forzar a PDO a pasar la llamada a la función MySQL como valor de consulta, por lo que no hay forma de hacer un contenedor simple que pueda usar NOW() o cualquier otra función como valores pasados. Cada vez que necesita algo así, necesita cambiar manualmente la consulta, por lo que la llamada a la función es parte de la cadena de consulta. :-(

estoy usando la función que pone a prueba los valores dados para la función de MySQL Estoy usando y modifica la consulta en sí, pero no es una buena solución a mi opinión ...: -}

2

Esto podría ser útil para algunos de ustedes, tal vez no. Me enfrenté con el mismo problema que Ollie Saunders. Soy bastante nuevo en php/mysql, y sobre todo PDO. Pude resolver el problema con lo siguiente:

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

y adivina lo que funciona! Espero haber ayudado aquí. Cualquier comentario es bienvenido. Pruébalo y dime si te funcionó, o si tienes alguna adición.

13

Suponiendo que su estado de DOP es correcta, se podría hacer algo como esto:

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

esto supone que tu servidor de aplicaciones con PHP está en la misma zona horaria que tus servidores de bases de datos, ¿no? –

+1

Hablando desde la experiencia, usar las funciones 'date' y' strtotime' para leer y escribir en la base de datos es una mala idea. De hecho, utilizan la configuración de zona horaria de PHP y podrían cambiar su marca de tiempo antes de que llegue a la base de datos. Probablemente no lo notarás a menos que mires el valor en la base de datos (por ejemplo, con el banco de trabajo). Para evitar dolores de cabeza, sugiero dejar que la base de datos maneje la configuración de NOW() y establecer la zona horaria de conexión de la base de datos y la zona horaria del servidor en UTC. El código de la aplicación debería hacer cualquier conversión de zona horaria de UTC al leer el valor. – Phil

+0

@Angel S. Moreno: No asume tal cosa. ¿Su 'time_created' se refiere a la creación de la base de datos, oa la creación del registro en cuestión?Este último, propongo, y si eso es así, filosóficamente/prácticamente el 'tiempo_created' se refiere a un tiempo 'más cercano' al usuario y su evento de edición de registro; en este sentido, lo más cercano estaría determinado por la distancia entre él y el servidor, sobre la cual no puede hacer suposiciones. Pero suponer que debería ser el tiempo de la base de datos es, al menos en este ejemplo, incorrecto. – Roadowl

0

Para responder a la pregunta de Elmo, que puede crear un contenedor DOP que permite funciones SQL como NOW(). Solo necesita pasar un argumento adicional con las columnas para las que desea usar las funciones de SQL. Esta es la mía:

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

} 

utilizar de esta manera:

$values = array(
    'ID' => NULL, 
    'name' => $username, 
    'address' => $address, 
); 

$sqlfuncs = array(
    'date' => 'NOW()', 
); 

pInsertFunc("INSERT INTO", "addresses", $values, $sqlfuncs); 

La cadena de consulta que da como resultado el siguiente aspecto:

INSERT INTO addresses (ID, name, address, date) VALUES (:ID, :name, :address, NOW())