PHP cambiando la antigua mysql_query a PDO

Tengo algunas consultas mysql_query antiguas en mi código que quiero convertir a PDO pero estoy luchando para ponerme a trabajar.

mi código original era:

mysql_query("UPDATE people SET price='$price', contact='$contact', fname='$fname', lname='$lname' WHERE id='$id' AND username='$username' ") or die(mysql_error()); 

ahora estoy intentando:

 $sql = "UPDATE people SET price='$price', contact='$contact', fname='$fname', lname='$lname' WHERE id='$id' AND username='$username'"; $q = $conn->query($sql) or die("failed!"); 

pero parece que no puede hacer que funcione, ¿alguna idea?

CÓDIGO ACTUALIZADO:

 $conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass); // check if the form has been submitted. If it has, process the form and save it to the database if (isset($_POST['submit'])) { // confirm that the 'id' value is a valid integer before getting the form data if (is_numeric($_POST['id'])) { // get form data, making sure it is valid $id = $_POST['id']; $fname = mysql_real_escape_string(htmlspecialchars($_POST['fname'])); $lname = mysql_real_escape_string(htmlspecialchars($_POST['lname'])); $contact = mysql_real_escape_string(htmlspecialchars($_POST['contact'])); $price = mysql_real_escape_string(htmlspecialchars($_POST['price'])); // check that firstname/lastname fields are both filled in if ($fname == '' || $lname == '' || $contact == '' || $price == '' ) { // generate error message $error = 'ERROR: Please fill in all requinetworking fields!'; //error, display form renderForm($id, $fname, $lname, $contact, $price, $error); } else { // save the data to the database $username = $_SESSION['username']; $query = "UPDATE people SET price=?, contact=?, fname=?, lname=? WHERE id=? AND username=?"; $stmt = $db->prepare($query); $stmt->bindParam(1, $price); $stmt->bindParam(2, $contact); $stmt->bindParam(3, $fname); $stmt->bindParam(4, $lname); $stmt->bindParam(5, $id); $stmt->bindParam(6, $username); $stmt->execute(); // once saved, networkingirect back to the view page header("Location: view.php"); } 

Para get más información, visite este enlace: PHP DOP

basado en tu ejemplo,

 <?php $query = "UPDATE people SET price=?, contact=?, fname=?, lname=? WHERE id=? AND username=?"; $stmt = $dbh->prepare($query); $stmt->bindParam(1, $price); $stmt->bindParam(2, $contact); $stmt->bindParam(3, $fname); $stmt->bindParam(4, $lname); $stmt->bindParam(5, $id); $stmt->bindParam(6, $username); $stmt->execute(); ?> 

Declaraciones preparadas de PDO y procedimientos almacenados

enter image description here

Tenga en count que cuando trabaje con el controller mysql para PDO siempre debe deshabilitar las instrucciones emuladas preparadas :

 $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = 'UPDATE people SET'; $sql.= ' price = :price,'; $sql.= ' contact = :contact,'; $sql.= ' fname = :fname,'; $sq;.= ' lname = :lname'; $sql.= ' WHERE id= :id AND username = :username'; $stmt = $pdo->prepare($sql); $stmt->execute(array( ':price' => $price, ':contact' => $contact, ':fname' => $fname, ':lname' => $lname, ':id' => $id, ':username' => $username, )); 

Como puede ver, he usado parameters con nombre, porque cuando tiene muchos de ellos está mucho más claro de lo que está haciendo.

Nota: que ircmaxell está trabajando actualmente para get el valor pnetworkingeterminado para usar siempre las declaraciones preparadas reales , pero hasta que eso (que puede tomar algún time) siempre tiene que deshabilitarlas para mysql.

Si va a utilizar PDO, debe search en prepare() y execute contrario, está perdiendo la security que ofrece PDO y conservando las inyecciones de SQL. Entonces, dado tu ejemplo:

 $conn = new PDO(/*connection info*/); $query = $conn->prepare("UPDATE people " . "SET price = :price, " . " contact = :contact, " . " fname = :fname, " . " lname = :lname " . "WHERE id = :id " . " AND username = :username"); $result = $query->execute(array( ':price' => $price, ':contact' => $contact, ':fname' => $fname, ':lname' => $lname, ':id' => $id, ':username' => $username )); 

Esa es una manera más laxa, pero también puede bindParam y ser explícito en cuanto al tipo de datos que espera.

Pocas cosas que debe tener en claro al usar la extensión PDO es que hay múltiples forms de hacer las cosas.

La forma en que estás usando actualmente es uno de ellos, incluidos algunos más. Sin embargo, siempre es una buena idea vincular los parameters por separado, ya que esto evita muchos problemas como la inyección de SQL y muchos más.

Otras cosas importantes a mirar son statement , prepare y execute .

 $conn = new PDO("...."); //Creating the handler //Create the statement $stmt = $conn -> prepare("UPDATE people SET price = :price, contact = :contact, fname = :fname, lname = :lname WHERE id= :id AND username = :username"); // Bind the params $stml -> bindParam(":contact", $contact, PDO::PARAM_STR); //This way you can also define the DATATYPE of the parameter //Execute $stmt -> execute(array( ":price" => $price, //another way of binding the params ":fname" => $fname, ":lname" => $lname, ":id" => $id, ":username" => $username));