Newsgroup: it.comp.www.php
Titolo: Scrivere del testo su DB e dormire tranquilli

Salve a tutti,
 
dopo mill'anni che ruzzo[*] col web, per la prima volta mi trovo a dover
far interagire gli utenti col mio database.
 
[*] dopo un secolo che giochicchio, mi diverto.
 
Sciocchezzuola, in apparenza; poi uno va a leggere gli articoli di chi
col web ci lavora (o sostiene di lavorarci) e si imbatte in un carosello
di "ATTENZIONE AI CARATTERI PERICOLOSI", "OCCHIO ALLE SQL INJECTION",
"BADATE AI GRASSI SATURI".
 
E dunque mi rivolgo a voi per vedere se mi sfugge qualcosa. Posto che
preferisco evitare l'impiego di htmlentities (non vedo per quale motivo
dovrei "entitare" tutto) la mia ripulita finale se ne sta in paio di
function, che sono le seguenti:
 
function Ripulisci_x_DB($s) {
 
       $s=preg_replace("/\&/",'&amp;',$s); 
// se l'utente scrive "&bull;", nell'output vedremo "&bull;"
// e non il pallino
 
        $s=preg_replace("/\"/",'&quot;',$s);
// le virgolette possono far casino se per qualche motivo
// vengono outputtate in un campo di testo: value=" " "
 
        $s=preg_replace("/</",'&lt;',$s); // via tag
        $s=preg_replace("/\>/",'&gt;',$s); // idem
 
        $s=preg_replace("/\\\/",'&#92;',$s); // di questo il motivo
// non lo ricordo, ma mi sembra professionale :-)
 
return $s;
}
 
 
Un attimo prima dell'INSERT passo da qui:
 
function Escapa_x_DB($s) {
        if (!get_magic_quotes_gpc()) {
        return addslashes($s);
        }
        return mysql_real_escape_string($s);
}
 
E con questa abbiamo sistemato il problema degli apici.
 
Mi manca qualcosa per dormire tranquillo?
 
Grazie.
 
-- 
mailto: y = i
------------------------------------------------------
http://www.catarsi.it
 
Vivo nel terrore di non essere frainteso (Oscar Wilde)

 Mi manca qualcosa per dormire tranquillo?
 
Sì, che è comunque sbagliato. :D
 
Le funzioni mysql_* sono deprecate da PHP 5.5, e verranno probabilmente 
rimosse in PHP 5.6 (è appena uscita la prima alpha. Non stiamo parlando 
di decenni)
 
Il modo migliore è usare PDO:
 
$s = $_GET['blablabla']
if ( get_magic_quotes_gpc() ) {
  $s = stripslashes($s);
}
 
$pdo = new PDO('mysql:...', 'username','password');
$stmt = $db->prepare('insert into pippo (colonna) values (:colval)');
$res = $stmt->execute(array('colval' => $s));
 
Sette righe (compresa la connessione al DB) e sei a posto. :)
Col vantaggio che se domani sposti il sito su postgres, continua a 
funzionare, senza dover andare a cercare tutti i mysql_parappappa() e 
sostituirli con pgsql_parappappa()
 
Bye.
 

 Il modo migliore č usare PDO:
 
Ok, ora vedo di capire qualcosa in piů di questa nuova diavoleria PDO.
Devo perň configurare il server in locale, che subito dopo la prima
istruzione:
 
$pdo = new PDO('mysql:host=localhost;dbname=testa', 'root','password');
 
mi mostra questo errore:
 
Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[42000] [1049] Unknown database 'testa'' in
/Library/WebServer/Documents/cata_web/test.php:11 Stack trace: #0
ecc.
 
In remoto no, lě fila tutto liscio. E' per questo che penso si tratti di
configurare Apache in locale.
 
Bene, per ora ti ringrazio. Poi magari, effettuati i dovuti esperimenti,
mi rifaccio vivo.
 
A presto!


 configurare Apache in locale.
 
Sembra sia solo una questione di DB piuttosto che di Apache.
Usa mysql da riga di comando oppure 
http://www.sequelpro.com/
 come GUI e dai
uno SHOW TABLES per vedere se la tabella c'è. Se c'è probabilmente devi usare
GRANT per dare l'accesso al tuo utente.
 
-- 
Andrea
 

 GRANT per dare l'accesso al tuo utente.
 
Il DB "testa" esiste, lo uso per testare qualunque bizzarria mi passi pā
capa e mi ci collego regolarmente. Nel primo comando di tabelle non se
ne parla ancora:
 
new PDO('mysql:host=localhost;dbname=testa'
 
e il fatal error dice che gli č sconosciuto proprio "testa".
 
Ora, per quel minimo che ne so, GRANT serve a dare certi privilegi a me
e altri a te. Sicuro che c'entri qualcosa col fatto che "testa" sia
unknown?
 
Intendiamoci, una prova posso sempre farla, perņ via, sii buono: dammi
un po' di pappa scodellata e fammi vedere cosa devo scrivere (non so se
prima o dopo) new PDO. Thanks.


 prima o dopo) new PDO. Thanks.
 
Posta il codice che usa le mysql_* con il quale sei *sicuro* di riuscire  
a cennetterti

 a cennetterti
 
$db_host = "localhost";
$db_user = "root";
$db_password = "";
$db_name = "testa";
 
$db = mysql_connect($db_host, $db_user, $db_password);
 
if ($db == false) {
die ($ErroreConnessione);
}
 
if (mysql_select_db($db_name, $db)  == false ) {
die ($ErroreConnessione);


 wrote:


 


Posta il codice che usa le mysql_* con il quale sei *sicuro* di riuscire


a cennetterti




$db_host = "localhost";


$db_user = "root";


$db_password = "";


$db_name = "testa";






Per errore ho scritto tabella ma pensavo ai database.


Prova qualcosa come:




$db_host = "localhost";


$db_user = "root";


$db_password = "";


$db_name = "testa";




$column = "Database";


$dsn = "mysql:host=$db_host";


$eol = "<br />\n";


$statement = "SHOW DATABASES";






$connection = new PDO($dsn, $db_user, $db_password);




foreach ($connection->query($statement) as $row)


{


  
print($row[$column] . $eol);


}






Oppure apri un terminale e dai
 


  
mysql -u root -h localhost "SHOW DATABASES"




--
 


Andrea





 Prova qualcosa come:
 
Roba da matti: col tuo script mi sono apparsi TUTTI i nomi dei dadabase
che ho in locale ALL'INFUORI di testa. Allora sono andato a
(ri)controllare con phpMyAdmin: TESTA C'ERA! Insomma, sai che ho fatto?
L'ho distrutto e ricreato. Ora va alla perfezione e viene visto come gli
altri. Non me ne spiego il perché ma "fa' vaěni" (che nella mia lingua
significa "che importanza ha"). 
 
Grazie mille, d'ora in poi vedrň di sperimentare questo benedetto PDO.


 altri.
 
Probabilmente le credenziali che usi in phpMyAdmin non sono "root":"" anche
se root avrebbe comunque dovuto vedere "testa".
 
Istalla Sequel Pro e campa felice.
 
-- 
Andrea