Datetime NOW PHP mysql (+ variante PDO)

Grazie per aver guardato. Tutte le risposte / commenti utili sono stati votati.

In PHP, puoi usare NOW () in questo modo:

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

Come posso fare la stessa cosa in DOP. Quando mi lego in questo modo, ottengo un errore:

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

È il PDO: PARAM_STR?

Basta fare questo:

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

Anche se devi avere il giusto tipo di colonna. date o time da sola, non functionrà se ricordo correttamente; deve essere datetime o forse timestamp ?


AVVERTIMENTO

mysql_* è deprecato da PHP 5.5.0 e versioni successive: http://php.net/manual/en/function.mysql-query.php

Si prega di utilizzare invece PDO; vedi la risposta di Stefan Gehrig.

Poiché nessuno ha risposto esplicitamente alla domanda (sebbene la risposta corretta possa essere estratta dai commenti alla risposta di Ollie Saunders ), aggiungerò la risposta corretta per completezza.

 $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(arrays( ':id' => $id, ':value' => $value )); 

Presumendo che la tua istruzione DOP sia corretta potresti fare qualcosa del genere:

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

Nessuna delle risposte risolve la domanda come la vedo io!

Quindi ci sono alcune mie scoperte: NON c'è MODO come forzare PDO a passare la chiamata di function MySQL come valore di query – quindi non c'è modo di fare un semplice wrapper che sarà in grado di usare NOW () o qualsiasi altra function come passata valori. Ogni volta che hai bisogno di qualcosa del genere, devi modificare manualmente la query, quindi la chiamata alla function fa parte della string di query. 🙁

Sto usando una function che verifica i valori dati per la function MySQL che sto usando e modifica la query stessa, ma a mio avviso non è una buona soluzione …: -}

oltre a NOW () utilizzo anche la colonna del tipo "timestamp" e impostiamo il valore predefinito su CURRENT_TIMESTAMP .. quindi non passo nulla per quel field e l'ora viene impostata automaticamente. forse non esattamente quello che stai cercando.

Questo potrebbe essere utile per alcuni di voi, forse no. Mi sono confrontato con lo stesso problema di Ollie Saunders. Sono piuttosto nuovo su php / mysql e soprattutto su PDO. Sono stato in grado di risolvere il problema con il seguente:

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

e indovina cosa funziona! Spero di aver aiutato qui. Qualsiasi commento è benvenuto. Provalo e dimmi se ha funzionato per te, o se hai qualche aggiunta.

Per rispondere alla domanda di Elmo, è ansible creare un wrapper PDO che consenta funzioni SQL come NOW (). È sufficiente passare un argomento aggiuntivo con le colonne per le quali si desidera utilizzare le funzioni SQL. Ecco il mio:

 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 arrayss, 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 = arrays_keys($values); $sqlfunc_columns = arrays_keys($sqlfunctions); $columns = arrays_merge($value_columns, $sqlfunc_columns); // Only $values become ':paramname' PDO parameters. $value_parameters = arrays_map(function($col) {return (':' . $col);}, $value_columns); // SQL functions go straight in as strings. $sqlfunc_parameters = arrays_values($sqlfunctions); $parameters = arrays_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); } 

Usalo in questo modo:

 $values = arrays( 'ID' => NULL, 'name' => $username, 'address' => $address, ); $sqlfuncs = arrays( 'date' => 'NOW()', ); pInsertFunc("INSERT INTO", "addresses", $values, $sqlfuncs); 

La string di query risultante ha il seguente aspetto:

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