Newsgroup: it.comp.www.php
Titolo: mysqli ed inserimento di stringhe in DB

Sto passando dall'uso di mysql alle analoghe istruzioni mysqli:
 
$conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
$ri = mysqli_query($conn, $query);
$row = mysqli_fetch_array($ri);
printf("Error: %s<br>", mysqli_sqlstate($conn));
 
poi per inserire delle stringhe nalla query uso:
 
function safe($conn, $value){
   return mysqli_real_escape_string($conn, $value);
}
$query = "xxxxxxx '".safe($conn, $inputstringfromuser)."' yyyyyyyy";
 
Sto seguendo la via buona oppure sono completamente fuori strada?
 
-- 
Sandro kensan 
www.kensan.it
 & 
www.qiqi.it
 geek site
Saluto gli agenti della NSA - Hello NSA - 
www.nsa.gov
 

 Sto seguendo la via buona oppure sono completamente fuori strada?
 
 
La via buona sarebbe passare a PDO, se non c'è niente che te lo 
impedisce, fallo.

 impedisce, fallo.
 
Grazie.


 impedisce, fallo.
 
Un po' indispettito per via del fatto che il mio sito è in mysql e lo
sto portando in mysqli, sono andato a vedere PDO e mi pare che sia
meglio. Mi pare che le query siano effettivamente migliori con la
separazione tra i dati e la richiesta di query.
 
Questo quello che ho trovato:
 
try {
      $connessione = new PDO(mysql:host=$dbhost;dbname=$dbname, $dbuser,
$dbpass);
} catch(PDOException $e) {
      die("Errore durante la connessione al database!: " .
$e->getMessage());
}
 
Query:
 
$query = "SELECT * FROM Prodotti WHERE id = :id LIMIT 1";
$result = $connessione->prepare($query);
 
$result->execute(array(
    ":id" => $id
));
 
Fetch (solo un risultato, solo una riga, corrispondente a row)
 
while($riga = $result->fetch(PDO::FETCH_ASSOC)) {
      echo "Nome prodotto: " . $riga["nome"];
      echo "Prezzo: " . $riga["prezzo"] . "€";
}
 
Query and fetch
 
$query = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$result = $conn->prepare($query);
$result->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $result->fetchAll(PDO::FETCH_ASSOC);
$result->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $result->fetchAll(PDO::FETCH_ASSOC);
 
foreach($red as $row){}
 
foreach($yellow as $row){}


 Questo quello che ho trovato:
 
Se hai voglia di fare un altro passetto :D ci sarebbe anche Aura.Sql che 
è un wrapper leggero sopra PDO, che ti permette, per esempio, anche di 
fare l'escape dei nomi dei campi (nel caso fossero dinamici), di 
richiamare execute passando un array di parametri senza fare il doppio 
passaggio prepare/execute e altre robette del genere.
 
Lo trovi su Packagist, installabile con composer.
 
Bye.

 Lo trovi su Packagist, installabile con composer.
 
Grazie per l'informazione. Ho un piccolo sito e non so se ha Aura.sql,
si tratta di un hosting condiviso.
 
PDO mi pare ottimale per le mie esigenze e comunque sto trovando qualche
difficoltà. Per esempio non c'è la funzione mysql per avere il numero di
righe tratte da una query per cui bisogna arrangiarsi con un fetchall e
un count dell'array. Ma sto procedendo.


 un count dell'array. Ma sto procedendo.
 
Sì, è una piccola seccatura, ma in realtà ho scoperto che non è poi così 
comune aver bisogno del numero di righe, e quando ti serve, fare una 
select count apposta prima non costa molto di più e prepara il DB per la 
query vera.
 
Anche perché in questo modo puoi usare i cursori e caricare in memoria 
solo la riga che stai elaborando, invece di tutto il resultset.
 
Bye.