8722 sujets

Développement web côté serveur, CMS

Bonjour à toutes et tous.

J'ai fais des recherches préalable sur ce forum, je cherche à scinder une liste existante de noms d'une table SQL par ordre alphabétique comme suit (séparation en chapitre <p> </p>) :

anna, anael...

bertrand, bob...

etc...

J'ai le code suivant qui me pose problème car il me crée une page blanche (hors les erreur php sont activées sur le serveur) :


<p>
<?php
$con=mysqli_connect("localhost","nom de la BDD","Pass utilisateur","Utilisateur de la BDD");
mysqli_set_charset($con,"utf8");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result_name = mysqli_query($con,"SELECT * from wp_rg_lead_detail WHERE field_number = 7 ORDER BY value asc");

if(!$result_name) {
    printf("Error: %s\n", mysqli_error($con));
    die(mysql_error()); // TODO: better error handling
}

$lettre='a';
while($name = mysqli_fetch_array($result_name))
  {
	if($lettre!=substr($name['value'],0,1))
		echo '	</p>
				<p>';
		$lettre=substr($name['value'],0,1);
	}
	echo " " . ucwords(strtolower($name['value'])) .",";

mysqli_close($con);
?>


Pouvez-vous m'aider à trouver ce qui cloche ? En vous remerciant !
Modifié par Claymenia (27 Nov 2013 - 10:49)
Bonjour,

die(mysql_error()); // TODO: better error handling

Ceci pourrait renvoyer la page blanche. Tu as vérifié si ta requête était correcte ?
requête correcte car le code fonctionne sans les partie de scindage :
$con=mysqli_connect("localhost",*************","***************","*******************");
mysqli_set_charset($con,"utf8");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result_name = mysqli_query($con,"SELECT * from wp_rg_lead_detail WHERE field_number = 7 ORDER BY value asc");

if(!$result_name) {
    printf("Error: %s\n", mysqli_error($con));
    die(mysql_error()); // TODO: better error handling
}


while($name = mysqli_fetch_array($result_name))
  {
echo " " . ucwords(strtolower($name['value'])) .",";
  }

mysqli_close($con);


Cela m'affiche bien la liste par ordre alphabétique d'un bloc. Enlever le die ne change rien : le code html est toujours vide dans le vide... nada ! Smiley ohwell
Modifié par Claymenia (27 Nov 2013 - 08:58)
J'ai réussi à afficher une erreur SQL :

Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_mysql.dll' - /usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_mysql.dll: cannot open shared object file: No such file or directory in Unknown on line 0 Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_gd2.dll' - /usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_gd2.dll: cannot open shared object file: No such file or directory in Unknown on line 0 


Mon serveur étant sous debian/whm
Modifié par Claymenia (27 Nov 2013 - 09:15)
Modérateur
Claymenia a écrit :
J'ai réussi à afficher une erreur SQL :

Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_mysql.dll' - /usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_mysql.dll: cannot open shared object file: No such file or directory in Unknown on line 0 Warning: PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_gd2.dll' - /usr/local/lib/php/extensions/no-debug-non-zts-20100525/php_gd2.dll: cannot open shared object file: No such file or directory in Unknown on line 0 


Mon serveur étant sous debian/whm

Bonjour, un problème de config php qui tente d'ouvrir l'extension windows (.dll) mysql
Il faudrait vérifier le php.ini sur le serveur. La ligne correspondante devrait être commentée, et une ligne avec une extension .so au lieu de .dll devrait être non-commentée.

Sans extension mysql valide, PHP a effectivement de la peine à faire des requêtes…
Modifié par kustolovic (27 Nov 2013 - 10:51)
Bonjour,

J'ai vérifié avec la commande grep extension /usr/local/lib/php.ini

je me retrouve avec :

; dynamically loaded extension (either a PHP extension or a Zend extension),
; you may only use these constants *after* the line that loads the extension.
; leading '/'. You must also specify the file extension being used including
; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20100525"
; If you wish to have an extension loaded automatically, use the following
extension = "php_mysql.dll"
extension = "php_gd2.dll"
extension = "pdo.so"
extension = "pdo_sqlite.so"
extension = "pdo_mysql.so"
; needs to go here. Specify the location of the extension with the
; extension_dir directive above.
; dictionary files. Include the base filename, but not the file extension.

J'ai vérifié dans le chemin et je n'ai que ces fichiers :
ixed.5.4.lin pdo_mysql.so* pdo.so* pdo_sqlite.so*

il me manque donc deux extension, dont les extension sont effectivement windowsiennes... une idée ? Smiley bawling
Modérateur
Commence par commenter les extensions non chargeables pour éviter les plantées et erreurs

il faudrait en fait pour ce que tu utilises l'extension mysqli.so
Mais cela peut se trouver dans un autre fichier (mysqli.ini par exemple)
En utilisant phpinfo() tu pourras voir tous les fichiers .ini chargés

Si tu ne trouves rien de tout cela, il faudra probablement passer par
apt-get install php5-mysql


(Ou utiliser pdo_mysql Smiley langue )
Modifié par kustolovic (27 Nov 2013 - 11:45)
Question idiote : c'est quoi la version de ton php ? Smiley biggol parce que l'extension mysqli_ est sensée être native depuis la version 5.0... J'ai jamais entendu parler de devoir installer le mysqli.ini...
Modérateur
La 5+ je pense, PDO n'existait pas pour la 4…

Et non mysqli est une extension, comme le sont toutes libraires de connexion à des bases de données. Mysqli est certes packagé et installé par défaut dans la plupart des distributions, mais ce n'est pas un absolu. (Et pas du tout natif)
Modérateur
Par contre j'ai tiqué sur l'erreur de chargement de PHP, mais selon ta réponse http://forum.alsacreations.com/topic-20-69814-1.html#p467403 tu as bien mysqli qui fonctionne… donc le problème doit venir d'ailleurs.

Trouvé Smiley langue

c'est un problème de code et de {}

tu as écris:

while($name = mysqli_fetch_array($result_name))
  {
	if($lettre!=substr($name['value'],0,1))
		echo '	</p>
				<p>';
		$lettre=substr($name['value'],0,1);
	}
	echo " " . ucwords(strtolower($name['value'])) .",";

qui s'écrirait donc (en mieux indenté):

while($name = mysqli_fetch_array($result_name)) {
  if($lettre!=substr($name['value'],0,1)) echo "</p>\n<p>";
  $lettre=substr($name['value'],0,1);
}
echo " " . ucwords(strtolower($name['value'])) .","; // ici $name est nul.


et je suppose que tu voulais écrire


while($name = mysqli_fetch_array($result_name)) {
  if($lettre!=substr($name['value'],0,1))  {
    echo "	</p>\n				<p>";
    $lettre=substr($name['value'],0,1);
  }
  echo " " . ucwords(strtolower($name['value'])) .",";
}
Ok pb résolu côté serveur. Suppression des lignes .dll et correction du code (merci kustolovic)

Toutefois j'ai un soucis de taille : le code m'affiche les noms... en scindant en plusieurs lignes la lettre "a" par exemple...

première ligne les ab, ad, ag, ai

seconde ligne (un paragraphe) les ak

troisième ligne (paragraphe toujours en <p>) les alb, ale, alfi

quatrième ligne (idem) les alfo

cinquième ligne les ali, am, and

sixième les alg....

Je ne comprends quelle est la raison de ce tri
Modifié par Claymenia (27 Nov 2013 - 20:12)
Modérateur
Y'a-t-il des noms avec majuscules et d'autres sans? => a != A
Si non il y a peut-être des caractères invisibles en début de chaîne? essaie avec substr(trim($name['value'],0,1))
$lettre='a';
while($name = mysqli_fetch_array($result_name)) {
if($lettre!=substr(trim($name['value'],0,1))) {
echo " </p>\n <p>";
$lettre=substr(trim($name['value'],0,1));
}
echo " " . ucwords(strtolower($name['value'])) .",";
}

la liste est chargée en un bloc sans les paragraphes...
Modifié par Claymenia (27 Nov 2013 - 20:42)
Modérateur
Il faudrait afficher les erreurs, ça aiderait… ou utiliser un programme qui vérifie la syntaxe de ton code.


if($lettre!=substr(trim($name['value'],0,1)) ) {


Il manque la parenthèse fermante à la fin du if
kustolovic a écrit :
Il faudrait afficher les erreurs, ça aiderait… ou utiliser un programme qui vérifie la syntaxe de ton code.


if($lettre!=substr(trim($name['value'],0,1)) ) {


Il manque la parenthèse fermante à la fin du if


Oui j'ai corrigé, la liste s'affiche en un bloc sans les <p>

Il y a dans la même valeur nom et prénom...

EDIT : effectivement je viens de supprimer le ucwords(strtolower les retours à la lignes sont en sur les minuscules
EDIT 2 : trim me met également la liste en block comme si j'ajoute :

if($lettre!=substr(ucwords(strtolower($name['value'],0,1)))) {

Modifié par Claymenia (27 Nov 2013 - 21:08)
Modérateur
Au temps pour moi j'ai mis le trim au mauvais endroit…


if($lettre!=substr(trim($name['value']),0,1) ) 


pour le teste sur la casse, pas besoin de mettre en minuscule puis en majuscule. Tester sur les minuscules ira très bien, il ne faut pas oublier l'affectation non plus:


while($name = mysqli_fetch_array($result_name)) {
  if($lettre!=strtolower(substr(trim($name['value']),0,1)))  {
    echo "	</p>\n				<p>";
    $lettre!=strtolower(substr(trim($name['value']),0,1));
  }
  echo " " . ucwords(strtolower($name['value'])) .",";
}

et pour rendre cela un peu plus clair:


while($name = mysqli_fetch_array($result_name)) {
  $value = strtolower(trim($name['value']));
  if( $lettre != $value[0] )  {
    echo "	</p>\n				<p>";
    $lettre != $value[0];
  }
  echo " " . ucwords($value[0]) .",";
}
euh en fait j'ai une chose assez étrange avec ton code :

while($name = mysqli_fetch_array($result_name)) {
  $value = strtolower(trim($name['value']));
  if( $lettre != $value[0] )  {
    echo "	</p>\n				<p>";
    $lettre != $value[0];
  }
  echo " " . ucwords($value[0]) .",";
}


donne :

A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A,
B,

B,

B,

B,

B,

B,

B,

B,



et le code suivant :

while($name = mysqli_fetch_array($result_name)) {
  if($lettre!=strtolower(substr(trim($name['value']),0,1)))  {
    echo "	</p>\n				<p>";
    $lettre!=strtolower(substr(trim($name['value']),0,1));
  }
  echo " " . ucwords(strtolower($name['value'])) .",";
}


fait bien apparaître les noms en entier par contre cela garde le même agencement... seul la lettre A est mis en paragraphe, après chaque autre nom est listé en retour à la ligne (un paragraphe par nom)....
Modifié par Claymenia (27 Nov 2013 - 21:33)
ok le bon code est
while($name = mysqli_fetch_array($result_name)) {
  if($lettre!=strtolower(substr(trim($name['value']),0,1)))  {
    echo "	</p>\n				<p>";
    $lettre=strtolower(substr(trim($name['value']),0,1));
  }
  echo " " . ucwords(strtolower($name['value'])) .",";
}


Merci beaucoup ^^