piccola polemica

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.044
150
63
PR
www.borgo-italia.it
ciao
visto che curioso sempre qua e lè nel forum ho trovato un post in cui alex da un codice per mysql usando le librerie pdo, vorrei quindi (ri)proporre una plemica che ho letto tempo fa' su un testo di php (lì solo accennata).

caso 1
PHP:
<?php
if ($_REQUEST['searchtext'] != '') {
    $stm = $db->prepare('SELECT * FROM '. PREFIX .'pm_search WHERE keywords = ?');
    $stm->execute(array($_REQUEST['searchtext']));
    if ($stm->rowCount() > 0) {
        $sql = 'UPDATE '. PREFIX .'pm_search SET hit = hit + 1 WHERE keywords = ?';
    }
    else {
        $sql = 'INSERT INTO '. PREFIX .'pm_search (keywords, hit) VALUES (?, 1)';
    }
    $stm = $db->prepare($sql);
    $stm->execute(array($_REQUEST['searchtext']));
}
else {
    echo 'Non hai ricercato alcuna keyword.';
} 
?>
caso 2
PHP:
<?php
if ($_REQUEST['searchtext'] != '') {
	$ris=mysql_query("SELECT * FROM  tabella WHERE keywords = \'".$_REQUEST['searchtext']."\'");
	if(mysql_num_rows($ris)>0){
		$ris=mysql_query("UPDATE tabella SET hit = hit + 1 WHERE keywords = \'".$_REQUEST['searchtext']."\'");
	}else{
		$ris=mysql_query("INSERT INTO tabella(keywords, hit) VALUES(\'".$_REQUEST['searchtext']."\', 1)");
	}
}else{
	    echo 'Non hai ricercato alcuna keyword.';
}
?>
nel primo caso 17 righe (119 parole, 975 caratteri spazi inclusi o 818 se esclusi), nel secondo 12 righe (44 parole 430 caratteri spazi inclusi o 384 se esclusi), quindi un 80% di righe in più.
quindi l'uso di classi o, come in questo caso di librerie, non porta a scrivere un codice piu ponderoso?
non discuto sulla validità (o sulla sicurezza), ma sul fatto che per fare la stessa cosa devo digitare 975 caratteri al posto di 430.
senza contare, ma questa è una mia opinione personale, che più semplice e lineare è un codice e più comunque risulta leggibile

p.s.
stuzzicare alex è una cosa che mi diverte molto:love:
 
Ti rispondo molto semplicemente: varrebbe la pena di usare PDO al posto di qualche libreria "clandestina" che usa ancora le vecchie funzioni mysql_* anche se si usassero 1000 righe di codice in più.

Mi sembra piuttosto ovvio che la programmazione ad oggetti implichi lo scrivere più codice. Questo era chiaro a tutti. Ma c'è una bella differenza tra scrivere:
PHP:
mysql_query('INSERT INTO users (username, password, email) VALUES (`pincopallino`, SHA1(`password`), `[email protected]`)
E scrivere:
PHP:
// supponendo che User sia una classe valida
$user = new User();

$user->setUsername('pincopallino');
$user->setPassword(sha1('password'));
$user->setEmail('[email protected]');

// supponendo che $doctrine sia un'istanza di Doctrine
$em = $doctrine->getEntityManager();

$em->persist($user);
$em->flush();
Non credi? Il risultato è esattamente lo stesso, ma secondo te quale delle due è migliore?

C'è un motivo se queste tecniche sono fortemente incoraggiate, dopotutto. :)
 
ciao alex
sapevo di stuzzicarti.
però visto che io non sono un espertissimo i php direi:
la prima dal punto di vista di un inepesrto che sta imparando (non puoi guidare una ferrari se non sai guidare una 500)
la seconda onestamente non so, probabilmente da un punto di vista della sicurezza.


comunque per quanto riguarda:
C'è un motivo se queste tecniche sono fortemente incoraggiate, dopotutto.
nella mia, ahime, lunga cariera anche se non informatica, sono sempre stato scettico sullle "vere" motivazioni per cui si spinge qualcosa, non sempre sono limpide come dovrebbero.

ti faccio un es. (quasi informatico): alla sua uscita gli stessi rivenditori spingevano per farti usare autocad, fornendo anche copie non proprio "lecite" (anche se allora non c'eramo molte leggi); il tutto sino a che autocad non è diventato quasi uno standard, allora sono subentrate altre versioni e leggi molto più severe sulle copieche una volta non erano tanto abusive).
analogo discorso tutti i vari passaggi dal dos sino all'xp attuale (guarda te che dovevi cambiare anche tutti gli applicativi...euri, anzi allora lire).

p.s.
la mia esperienza è piuttosto lunghetta, il primo autocad era il 2.1 che mi aveva passato un amico del cnr (all'epoca lo usavano quasi solo loro), analogo per il dos

ps al p.s.
se hai tempo spiegami per bene la differenza
 
Doctrine è un ORM (Object Relational Mapper), cioè una libreria che fa in modo che ogni riga nel tuo database corrisponda ad un oggetto PHP nella tua applicazione. Infatti, se hai notato, pur non eseguendo alcuna query, l'utente sarà inserito correttamente nel database anche con la sintassi che ti ho mostrato (la classe User dev'essere correttamente configurata, ovviamente).

Oltre che per la sicurezza (per la quale basta usare PDO, non serve qualcosa di complesso come Doctrine), è anche molto utile per l'astrazione dell'accesso al database e per quegli sviluppatori che cercano di creare applicazioni fortemente object-oriented (anche se PHP non incoraggia certo questa tecnica, fornendo approcci a dir poco ridicoli alla soluzione di certi problemi che in altri linguaggi hanno native implementazioni).

Altro esempio:
PHP:
$em = $doctrine->getEntityManager();
$repo = $doctrine->getRepository('User');

// il metodo 'findOneByUsername' non esiste realmente nella classe UserRepository,
// ma viene fornito dinamicamente tramite il metodo magico __call()
$user = $repo->findOneByUsername('pincopallino');

if (!$user) {
    die('Utente non trovato.');
}

$user->setPassword(sha1('nuovapassword'));

$em->flush();
Queste (parecchie) righe di codice modificano la password dell'utente pincopallino. Ma lo stesso risultato si sarebbe potuto ottenere (su MySQL) con le seguenti righe:
PHP:
mysql_query('UPDATE users SET `password` = SHA1(`nuovapassword`) WHERE username = `pincopallino`');
Ma non trovi che il primo approccio sia il migliore?

Io penso che queste tecniche non siano incoraggiate perché c'è dietro qualche cospirazione (anche perché usare Doctrine non costa niente, e ci sono altre librerie che svolgono lo stesso compito) ma solo perché sono tecnologie che negli altri linguaggi si usano già da almeno un anno.
 
ciao
non nego che la prima sia forse più elegante e comunque più sicura, ma vedi a me piacciono due principi:
uno mutuato da ford (non quello di indiana, il padre dell'attuale auto ford): "quello che non c'è, non si rompe" e il secondo (non saprei dirti mutuato da chi) "perchè dire in 100 parole quello che si può dire in 10?"

penso che per ora, sinchè regge, continuerò ad usare la seconda (sono un po' pigro, ma forse non solo un po')

p.s.
non sempre riesco a seguire il secondo principio
 
È vero che quello che c'è non si rompe (quasi mai... vedi il "millennium bug" di MySQL), ma è anche vero che a volte quello che c'è funziona male.

Per quanto riguarda il secondo principio, beh... è ovvio che in applicazioni di piccole dimensioni tecnologie come l'ORM sono solamente uno spreco di tempo e risorse. Ma quando avrai a che fare con migliaia di righe di codice, ti vedi costretto asare in maniera diversa. :D

Ti lascio io un aneddoto:
Lo scrittore George Bernard Shaw vide un grande blocco di pietra in casa di un suo amico, lo scultore Jacob Epstein. «Che cosa farai con questo blocco?», domandò Shaw. «Non lo so, sto ancora decidendo», rispose Epstein. Shaw rimase sorpreso: «Vuoi dire che tu pianifichi la tua ispirazione? Non sai che un artista deve essere libero di cambiare idea quando vuole?». «Questo vale quando, cambiando idea, tutto quello che devi fare è accartocciare un foglio di carta che pesa cinque grammi. Ma quando hai a che fare con un blocco di quattro tonnellate, devi pensare diversamente».
 
ciao
bellissima citazione (sihg) non la conoscevo.
hai perfettamente ragione quando parli di
Ma quando avrai a che fare con migliaia di righe di codice, ti vedi costretto asare in maniera diversa
, ma un piccolo ma: chi frequenta il forum spesso non è uno che scrive 8000 righe di codice (chi lo fa probailmente non frequenta in quanto già dovrebbe essere all'altezza), spesso e volentieri è un principianate con problemi minuscoli (grossi per lui).
con questo non che non si debba proporre soluzioni più adeguate.

p.s.
MI PIACE DISCUTERE CON TE
 
Invece è proprio questo il punto: chi frequenta il forum solitamente scrive applicazioni da 8000 righe di codice che starebbero in 800, solamente che non è in grado di sviluppare come si deve. Comunque, per qualche strana ragione, se ti fai un giro sui forum inglesi/americani noterai che per loro hai scritto un pessimo script quando non usi tecnologie avanzate tipo MVC, namespace, autoloading e così via. Per loro non esiste:
PHP:
require_once 'MiaLibreria/MioNamespace/Classe.php';
new MiaLibreria_MioNamespace_Classe();
Ma esiste:
PHP:
spl_autoload_register(function($class) {
	if (strpos('MiaLibreria\\', $class) !== 0) {
		return;
	}
	
	$path = dirname(__FILE__) . '/'. str_replace('\\', '/', $class) . '.php';
	
	if (is_file($path)) {
		require_once $path;
	}
});

// notare che la classe diventa MiaLibreria\Namespace\Classe
use MiaLibreria\MioNamespace\Classe;

new Classe();
Questo anche a causa della scarsità di guide in Italiano decenti.
 
ciao alex
idea peregrina
Questo anche a causa della scarsità di guide in Italiano decenti.
perchè non scrivi una guida, eventualmente per il poco che sò posso darti una mano.
forse max the boss te la pubblica

dimenticavo:
in italiano.
ricordati che manzoni andò a sciacquare i panni in arno... no nell'hudson
 
Ultima modifica:
Infatti Manzoni ha scritto I Promessi Sposi, non una guida a PHP.

Ho pensato più volte di scriverla, ma dovrei trovare sia il tempo che (non lo nego) la voglia. Comunque pare che tra poco scriverò anche qualche articolo sul blog di MRW.
Appena avrò un periodo di tempo libero potrei dedicarmi alla guida, anche se ho già parecchie cose in pentola.
 

Discussioni simili