2012-09-07 11 views
6

Ho alcune vecchie query mysql_query nel mio codice che voglio convertire in PDO ma sto faticando a mettermi al lavoro.PHP che modifica la vecchia mysql_query in PDO

mio codice originale era:

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

Ora sto cercando:

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

ma non riesco a farlo funzionare, tutte le idee?

codice aggiornato:

$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

Se si passa a PDO, che è una grande idea, assicurarsi di utilizzare segnaposto SQL. Il tuo vecchio esempio è tipico di 'mysql_query' dove è probabilmente vulnerabile a gravi problemi di SQL injection. Come sempre, quali errori stai ottenendo? "Non riesco a farlo funzionare" non è una diagnosi utile. – tadman

+0

Nonostante i miglioramenti, il metodo dovrebbe funzionare. Puoi mostrare il codice completo, da dove inizierai il comando '$ conn'? – Starx

+0

scusa avrei dovuto essere più specifico, ho un modulo di modifica che consente agli utenti di modificare gli annunci che hanno pubblicato, quando fanno clic su un annuncio per modificarlo viene visualizzato il modulo e i valori precedenti sono già stati aggiunti al caselle di testo dal mio database. Funziona ancora bene (usa un'altra query), ora quando provo a sommare il modulo viene fuori l'errore "mysql_real_escape_string" che a mio parere suggerisce che il modulo sommi dati vuoti per così dire? quindi non sono sicuro che la mia query PDO sia errata perché funzionava bene con il vecchio codice mysql_query, grazie per il tuo aiuto !! – neeko

risposta

6

Per maggiori informazioni visitate questo link: PHP PDO

, sulla base di esempio,

<?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

grazie per la tua risposta! ho usato questo metodo, ma sto ancora ottenendo l'errore mysql_real_escape_string? potrebbe essere perché ho definito le mie variabili come "$ fname = mysql_real_escape_string (htmlspecialchars ($ _ POST ['fname']));" è necessario quando usi PDO o pensi che sia qualcos'altro? – neeko

+0

@NeilKumar prova a rimuoverlo, PDO eseguirà automaticamente l'escape per te. '$ fname = $ _POST ['fname'];' –

+0

ok ora ho errore fatale: chiamata a una funzione membro prepare() su un non oggetto in ... qualche idea su cosa significa? – neeko

5

Si noti che quando si lavora con il driver mysql per i prodotti DOP si sempre devi 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, 
)); 

Come potete vedere ho usato parametri denominati, perché quando hai un sacco di loro che è molto più chiaro di quello che stai facendo.

Nota: che ircmaxell sta funzionando al momento getting the default to always use real prepared statements, ma fino a che (che potrebbe richiedere del tempo) è necessario disabilitarli per mysql.

4

Se avete intenzione di utilizzare DOP, è necessario guardare al prepare() e execute altrimenti si sta perdendo la sicurezza che sta offrendo DOP e trattenere le iniezioni SQL. Quindi, dato il vostro esempio:

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

Questo è il modo più lassista, ma si può anche bindParam e essere espliciti per quanto riguarda il tipo di dati che è in attesa.

4

Poche cose devi essere chiaro mentre usi l'estensione PDO è che ci sono molti modi per fare le cose.

Il modo in cui si sta attualmente utilizzando è uno di essi, compresi alcuni di più. Tuttavia è sempre una buona idea per bind parameters separatamente, perché questo impedisce molti problemi come SQL Injection e molti altri.

Altre cose importanti da guardare sono statement, prepare e 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));