php
  • mysql
  • sql
  • pdo
  • 2012-09-07 14 views 6 likes 
    6

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

    mi código original:

    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 tratando:

    $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 conseguir 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 required 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, redirect back to the view page 
    header("Location: view.php"); 
    } 
    
    +2

    Si va a cambiar a PDO, que es una gran idea, asegúrese de utilizar marcadores de posición SQL. Su ejemplo anterior es típico de 'mysql_query' donde es probable que sea vulnerable a severos problemas de inyección de SQL. Como siempre, ¿qué errores estás obteniendo? "No se puede hacer funcionar" no es un diagnóstico útil. – tadman

    +0

    A pesar de las mejoras, su método debería funcionar. ¿Puedes mostrar el código completo, desde donde comienzas a iniciar '$ conn'? – Starx

    +0

    lo siento, debería haber sido más específico, tengo un formulario de edición que permite a los usuarios editar anuncios que han publicado, cuando hacen clic en un anuncio para editarlo, aparece el formulario y los valores anteriores ya están incluidos en el eco del cuadros de texto de mi base de datos. Esto todavía funciona bien (utiliza otra consulta), ahora cuando intento y sumbit el formulario aparece el error "mysql_real_escape_string" que para mí sugiere que el formulario está sufriendo datos en blanco, por así decirlo? así que no estoy seguro de si mi consulta PDO tiene la culpa, ya que estaba funcionando bien con el antiguo código mysql_query, ¡gracias por su ayuda! – neeko

    Respuesta

    6

    Para obtener más información, visite este enlace: PHP PDO

    basado en su 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(); 
    
    ?> 
    

    PDO Prepared statements and stored procedures

    enter image description here

    +0

    gracias por su respuesta! He utilizado este método, pero todavía estoy recibiendo el error mysql_real_escape_string? podría ser porque he definido mis variables como "$ fname = mysql_real_escape_string (htmlspecialchars ($ _ POST ['fname']));" ¿Es esto necesario cuando usa PDO o cree que es otra cosa? – neeko

    +0

    @NeilKumar intente eliminar eso, PDO automáticamente hará el escape por usted. '$ fname = $ _POST ['fname'];' –

    +0

    bien ahora me sale un error fatal: llamar a una función de miembro prepare() en un no objeto en ... ¿alguna idea de lo que esto significa? – neeko

    5

    Tenga en cuenta que cuando se trabaja con el conductor de MySQL para PDO que siempre tiene que disable emulated prepared statements:

    $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 se puede ver que he utilizado parámetros con nombre, porque cuando usted tiene un montón de ellos se está mucho más claro de lo que estás haciendo.

    Nota: ircmaxell que está trabajando actualmente en getting the default to always use real prepared statements, pero hasta que eso (que puede llevar algún tiempo) siempre hay que desactivarlas para MySQL.

    4

    Si usted va a utilizar DOP, es necesario mirar a prepare() y execute de lo contrario se está perdiendo la seguridad que ofrece DOP y retener las inyecciones SQL. Por lo tanto, dada su 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 
    )); 
    

    Eso es más bien la manera laxa, pero también bindParam y puede ser explícito en cuanto al tipo de datos que está esperando.

    4

    Pocas cosas que debe tener en claro al utilizar la extensión PDO es que hay varias maneras de hacer las cosas.

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

    Otras cosas importantes a tener en cuenta 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)); 
    
    Cuestiones relacionadas