[PHP] PDO prepared statement - select query errore

  • Creatore Discussione Creatore Discussione cleto
  • Data di inizio Data di inizio

cleto

Nuovo Utente
28 Feb 2012
14
0
1
Salve ho un DB dal nome 'test' con campi ID, post_title, post_content, post_name, post_date e la seguente query:

PHP:
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'test';
$id = 1;
try{

     $conn = new PDO("mysql:host={$db_host};dbname={$db_name}", "$db_user", "$db_pass");

     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    $stmt = $conn->prepare("SELCT * FROM objects WHERE ID  = :id ");
 
     $stmt->execute(array(":id" => $id));

      while($row = $stmt->fetch(PDO::FETCH_OBJ)){
 
         $results[] = $row;

      } 
 
      echo '<pre>' , print_r ($results) , '</pre>';

  } catch(PDOException $e){

    echo 'ERROR: ' . $e->getMESSAGE();

  }

e ricevo il seguente messaggio di errore:

ERROR: SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de 'SELCT * FROM objects WHERE ID = '1'' � la ligne 1

sapete darmi una dritta?...grazie
 
Perchè usi prepare per un select? Io lo uso sempre e solo per insert ed update.. crea una sorta di segnaposto da quanto ho capito, e si usa per prevenire le injection db. Per questo motivo lo uso prevalentemente quando vado ad inserire dati provenienti da fonti esterne, ma se devo recuperarmi un dato da db non l'ho mai usato.
Comunque appena ho un sec ti posto il codice che uso io se ancora non hai risolto.


Inviato dal mio iPhone utilizzando Tapatalk
 
Perchè usi prepare per un select? Io lo uso sempre e solo per insert ed update.. crea una sorta di segnaposto da quanto ho capito, e si usa per prevenire le injection db. Per questo motivo lo uso prevalentemente quando vado ad inserire dati provenienti da fonti esterne, ma se devo recuperarmi un dato da db non l'ho mai usato.

chi vuole compiere azioni malevole introduce del codice, in questo caso sql,
non sembra ovvio, anche se dovrebbe esserlo, che il codice può essere inserito in qualunque "veicolo", select comprese, che agisce su delle risorse

@cleto lascia il binding su ogni azione che interessa il db
 
  • Like
Reactions: otto9due
Grazie mille...e dire che l'ho riletta per ore (sic) e alla fine ho trovato anche questa sintassi:

PHP:
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'test';
$id = 1;
try{

    $conn = new PDO("mysql:host={$db_host};dbname={$db_name}", "$db_user", "$db_pass");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);             
             
     $sql = "SELECT *
                 FROM objects
                WHERE ID = :id";    
   
       $stmt = $conn->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
   
      $stmt->execute(array(':id' => $id));

            while($row = $stmt->fetch(PDO::FETCH_OBJ)){  
   
               $results[] = $row;
       
            }    

      echo '<pre>' , print_r ($results) , '</pre>';

 } catch(PDOException $e){
      echo 'ERROR: ' . $e->getMESSAGE();
 }

@cleto lascia il binding su ogni azione che interessa il db

mi vergogno della mia ignoranza ma non so che vuol dire
 
mi vergogno della mia non conoscenza, ma non so che vuol dire
proprio il modo di agire con i "segnaposto", detto in maniera molto semplice
che sono rappresentati con ":nome" oppure da un "?", ovvero
PHP:
SELECT * FROM objects WHERE ID = :id
oppure
SELECT * FROM objects WHERE ID = ?
puoi fare riferimento al manuale per le differenze ed ad un buon articolo, se hai del tempo ...
https://phpdelusions.net/pdo
 

Discussioni simili