MYSQL_SELECT + MYSQL_FETCH_ARRAY.. SIMPLIFIÉ

bobidop Messages postés 9 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 30 juillet 2006 - 30 juil. 2006 à 20:22
jcwanner Messages postés 1 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 17 avril 2007 - 17 avril 2007 à 23:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38865-mysql-select-mysql-fetch-array-simplifie

jcwanner Messages postés 1 Date d'inscription lundi 18 octobre 2004 Statut Membre Dernière intervention 17 avril 2007
17 avril 2007 à 23:07
Une tentative qui a déjà été faite et refaite.
Piège des débutants qui decouvrent l'objet et php, qui pensent trouver une idée de génie en faisant cela, mais qui au final se provoque plus de galère que autre chose.

Grand classique !
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
30 juil. 2006 à 23:47
Jmy met moi aussi :

function select($query, $sql_result) { // }
Méthode à 2 arguments et pourtant :
while($row = $sql->select("SELECT * FROM table"))

^==^ la haut y'en a qu'un seul ! Déja y'a un problème :)

"# if (!$sql_result)
# {
# $this->sql_result = mysql_query($query);
# }"

Tu fais un test sur quoi ? J'ai pas tout saisi la ... !

JE vois ce que tu veux faire. Pour faire ce que tu veux, tu dois faire quelque chose de plus grossier :

class mysql {
public $query;
public $sql;
public $iterate = FALSE;

// J'épargne la connection.

// $sql est la chaine SQL.
public function query($sql) {

if ( ! $this->iterate ) { // On vérifie si y'a pas déja eu un query()
$this->sql = $sql;
$this->query = mysql_query($this->sql) or die (mysql_error());
if ( mysql_num_rows($this->query) > 1 ) $this->iterate = TRUE;
} // Si y'a plus d'un enregistrement (donc faut boucler, on initialise Iterate pour éviter de refaire une requète.

if ( FALSE !( $data mysql_fetch_array($this->query) ) ) {
return $data; // Si ca boucle tjs, on renvoit
} else {
$this->iterate = FALSE; // Sinon on stop.
}

}

}

Bien entendu, ne jamais utiliser la méthode que j'ai mise :) C'est juste pour l'exemple lol !
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
30 juil. 2006 à 23:10
Salut!
Ta source ne marche pas telle quelle:
# if (!$sql_result)
# {
# $this->sql_result = mysql_query($query);
# }
>> Renvoie une notice car $sql_result pas pasés en param dans ton exemple

>> La fonction doit prendre deux params, sinon une erreur de plus

Me semble pas que $this->sql_result est défini...

Dommage d'utiliser mysql_fetch_array: je préfère soit mysql_fetch_row soit mysql_fetch_assoc

Pour terminer, y'a pas de gestion d'erreurs. Ainsi, si la requête contient une erreur mysql_fetch_array, renvoie une erreur...

@++

R@f
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
30 juil. 2006 à 22:11
Salut...

Je vois pas trop l'interet de réinventer la roue... tu aurais fait une classe d'abstraction SGDB d'accord mais il n'y aucun interet de faire une classe pour encapsuler les fonctions sql... c'est faire de l'objet histoire de faire de l'objet... tu gagne peut être en charactères à taper pour coder mais tu perd en performances... .. .

function sql()
{
/* Connection a la base de donnée */
$connect = @mysql_connect(host_sql, login_sql, passwd_sql);

D'où viennent host_sql, login_sql et passwd_sql... pareil pour db_sql... .. ?

Personnellement je trouve incorrect que ta classe gère l'affichage des erreurs... ce n'est pas son role... qui plus est si la connection échoue tu affiche un message d'erreur... c'est bien (quoique) mais tu ne shunte pas le mysql_select_db ce qui fera planter ton script... ou alors il faut remplacer le echo par un die mais pour un site pro en production c'est crade... .. .

incorrect => echo "...
correct => echo '...

Quel interet de mettre le mysql_fetch_array dans la methode select()... aucun... il faut faire une methode pour éxécuter les requete et une pour les traiter... .. .

SELECT * est à éviter car gourmand en resources d'autant plus qu'il n'est pas utile de rapatrier le contenu de tous les champs d'une table si tu n'a besoin que du contenu d'un seul champ... et tu fais comment si tu veux rajouter une clause WHERE... .. ?

Voili voilou... je te conseil de jeter un coup d'oeil à la classe qu'a posté FhX sur ce site elle est beaucoups plus complete... .. .

^_^

@ tchaOo°
bobidop Messages postés 9 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 30 juillet 2006
30 juil. 2006 à 20:22
oup's j'ai oublié un truc..

while($row = $sql->select("SELECT * FROM table", $row))
{
...
}
Rejoignez-nous