8768 sujets

Développement web côté serveur, CMS

Bonjour à vous tous,

J'ai enfin réussi à trouver d'où venait l'erreur suite à ce sujet https://forum.alsacreations.com/topic-20-89646-1-Erreur-PHP-que-je-ne-comprends-pas.html

Elle était double. Dans un premier temps, je me trompais dans le nom de la base de données et celui de la table. Ensuite, j'avais oublié un bout de code qui était celui-ci :

$result = $mysqli->query('SELECT ville_id, ville_nom, ville_texte FROM villes WHERE ville_id =' . $id);

où j'avais oublié à la fin
WHERE ville_id ='

Ces problèmes sont corrigés.

Mais maintenant j'ai ce souci :
upload/1654057575-62242-capturedancran2022-06-0106210.png
Je sais que c'est un problème d'encodage des caractères. Cependant, dans ma table, j'ai bien sélectionné utf8_general_ci dans l'interclassement, pour tous les champs sauf ville_id qui n'en a pas besoin vu que c'est le numéro de l'enregistrement auto incrémenté. J'ai également dans les deux pages HTML la balise :

<meta charset="UTF-8">

Vous savez d'où provient ce problème d'affichage ?
Merci pour votre sollicitation

Voici le code du fichier index.php

<!doctype html>
<html lang="fr">
<head>
	<meta charset="UTF-8">
	<link href="styles.css" type="text/css" rel="stylesheet">
	<title>Accueil</title>
</head>
<body>
	<div>
		<h1>Accueil</h1>
		<p>Mini site consacré aux villes</p>
		<p>Cette page utilise PHP et MySQL</p>
		<p>Utiliser le menu de navigation pour consulter les pages</p>
	<?php
		$mysqli = new mysqli('localhost', 'root', '', 'projet_villes_site');
		$result = $mysqli->query('SELECT ville_id, ville_nom FROM villes');
		while($row = $result->fetch_array()){
			$villes[$row['ville_id']] = $row['ville_nom'];
		}
	?>
	</div>
	<ul>
		<li><a href="index.php">Accueil</a></li>
		<?php foreach($villes as $id => $ville) : ?>
		<li><a href="ville.php?id=<?php echo $id ?>"><?php echo $ville ?></a></li>
		<?php endforeach ?>
	</ul>
	<?php
		$result->free();
		$mysqli->close();
	?>
</body>
</html>

Voici le code du fichier ville.php :

<!doctype html>
<html lang="fr">
<head>
	<meta charset="UTF-8">
	<?php
		$id = $_GET['id'];
		$mysqli = new mysqli('localhost', 'root', '', 'projet_villes_site');
		$result = $mysqli->query('SELECT ville_id, ville_nom, ville_texte FROM villes WHERE ville_id =' . $id);
		$row = $result->fetch_array();
		$nom = $row['ville_nom'];
		$texte = $row['ville_texte'];
	?>
	<title><?php echo $nom ?></title>
	<link href="styles.css" type="text/css" rel="stylesheet">
</head>
<body>
	<div>
		<h1><?php echo $nom ?></h1>
		<p><?php echo $texte ?></p>
		<?php
			$result = $mysqli->query('SELECT ville_id, ville_nom FROM villes');
			while($row = $result->fetch_array()){
				$villes[$row['ville_id']] = $row['ville_nom'];
			}
		?>
	</div>
	<ul>
		<li><a href="index.php">Accueil</a></li>
		<?php foreach($villes as $id => $ville) : ?>
		<li><a href="ville.php?id=<?php echo $id ?>"><?php echo $ville ?></a></li>
		<?php endforeach ?>
	</ul>
	<?php
		$result->free();
		$mysqli->close();
	?>
</body>
</html>

Voici la structure de la table villes :
upload/1654058284-62242-basededonnnes.jpg
Modifié par ObiJuanKenobi (01 Jun 2022 - 06:43)
Salut,

Sauf erreur : "l'interclassement" (collate en anglais je crois) c'est pour trié la colonne ce qui ne correspond pas à ce que tu veux faire.

Tu dois (devais..) indiquer le charset au moment où tu crées la base de données. Je suppose que tu es sous windows et que par défaut cela ne doit pas être de l'utf8 Smiley ohwell
Merci Bongota pour tes explications mais je ne sais pas comment accéder au .htaccess malgré que j'ai lu entièrement ton lien. Peux-tu m'expliquer comment faire ?

En effet Mathieuu, je suis bien sur Windows. Mais si ce que tu dis est vrai, j'ai alors été induit en erreur par le formateur. Parce que son cours d'initiation à l'utilisation de PHPMyAdmin montrait bien qu'il faut sélectionner utf8_general_ci dans la colonne interclassement de la structure de la base de données, pour afficher les caractères accentués. Maintenant, que la base de données est créé, on ne peut plus modifier ça ?

J'ai rajouté ça :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
dans la structure HTML mais ça ne change rien.
Modifié par ObiJuanKenobi (02 Jun 2022 - 06:42)
Salut,
je n'ai pas suivi tout depuis le début, mais est-tu en local ou en ligne ?
Même en ligne, tu devrais normalement avoir accès en modification à tous tes fichiers sur le serveur, y compris le .htaccess. Ce n'est ni plus ni moins qu'un fichier de configuration pour régler le fonctionnement du serveur (cache, compressions, redirections, protections de fichiers, accès restreint, etc.). À condition que le serveur soit sous Apache.
Si tu ne le vois pas sur ton espace, c'est qu'il faut activer "fichiers cachés". Sur l'éditeur Gedit, c'est comme ça. Après, tu ajoutes ce que je t'ai donné. Après modification, tu teste tout de suite ton site parce que ce fichier est sensible.
Bonjour,

Tu peux aussi essayer, après ta connexion à la base de données:

$mysqli = new mysqli("localhost", "log","pass","db");
$mysqli->set_charset("utf8")


Vérifie aussi que ton fichier php est bien dans l'encodage utf8: Avec notepad++ par exemple, regarde l'onglet "encodage".

Enfin, tu peux aussi spécifier l'encodage par une entête php:
header('Content-Type: text/html; charset=utf-8');

Modifié par loicbcn (02 Jun 2022 - 08:43)
Merci loicbcn, j'ai ajouté ça :

$mysqli->set_charset("utf8")
à la suite de la ligne de code PHP pour la connexion et ça marche.

J'ai vérifié que le fichier Notepad++ est bien encodé en utf8.

Je suis également en local pour le moment, je n'ai pas d'hébergement parce que je suis en initiation.

Par contre, je ne sais toujours pas où se trouve le fichier .htaccess. Où se trouve-t-il ? Je peux l'ouvrir avec Notepad++ ? Mes cours ne font pas allusion à ce fichier pour éventuellement le modifier.
Modifié par ObiJuanKenobi (02 Jun 2022 - 11:31)
ObiJuanKenobi a écrit :
Merci loicbcn, j'ai ajouté ça :

$mysqli-&gt;set_charset("utf8")

Par contre, je ne sais toujours pas où se trouve le fichier .htaccess. Où se trouve-t-il ? Je peux l'ouvrir avec Notepad++ ? Mes cours ne font pas allusion à ce fichier pour éventuellement le modifier.

.htaccess se trouve dans le répertoire à la racine du site
Il s'édite très bien avec Notepad++
Bonne question.
Effectivement le fichier .htaccess est un fichier qui agit sur le serveur distant, sur les échanges entre le serveur et ses clients. Il ne devrait pas avoir d'influence en local, je n'y avais pas pensé. À vrai dire, je n'en sait pas plus sur ce point particulier.
Je pensais que tu étais en ligne. En tous cas, tu le seras un jour. Ton fichier .htaccess, tu devras le faire toi même, avec NotePad, par exemple. Il est à la racine de ton site. De très nombreux exemples sont disponibles sur le net. En ligne, il est indispensable.
Quand tu en seras là, reviens ici demander.
J'ai trouvé un fichier .htaccess en suivant ce chemin :
OS (C:) -> wamp -> apps -> phpsysinfo3.3.4 - > .htaccess

C'est le bon ?

Je l'ai ouvert avec Notepad++ et son contenu est le suivant :

<files phpsysinfo.ini>
# Deny all requests from Apache 2.0-2.2
    <IfModule !mod_authz_core.c>
        order deny,allow
        deny from all
    </IfModule>
# Deny all requests from Apache 2.4+
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
</files>
Oui, c'est bien le bon fichier dont je parlais, mais il est minimaliste, il manque beaucoup de fonctions. Peu importe, il est là.
Ce que je vois de ce fichier, c'est qu'il "deny" toutes les requêtes dans les deux cas. Si je comprends bien, tout est refusé. Mais comme ce fichier est minimaliste, il ne refuse finalement que les modules, qui n'y sont de toute façon pas Smiley biggrin
S'il y a deux terminologies, c'est parce que il y a eu un petit changement de Apache 2.0-2.2 à Apache 2.4+.
Deny from all is now Require all denied
    Allow from all is now Require all granted

Tente d'enlever ce fichier .htaccess et de le mettre provisoirement dans un endroit neutre par rapport à ton site, tu le remettra après. Et regarde s'il y a le moindre changement.
S'il fonctionne, tu peux toujours tenter d'ajouter en haut de ce fichier celui que j'ai donné plus haut, mais comme dit précédemment , je crois qu'en local, il n'y aura pas d'influence,à moins que tu soit sur un serveur local Apache.
Ne connaissant pas php, je ne peux t'aider plus sur cette partie.
Non, le fichier .htaccess est un fichier que tu ajoutes à la racine de ton projet. ou dans un répertoire.

Il te faut créer ce fichier.

Pour ma part, je pense que ton problème peut se résoudre sans .htaccess.
Oui, mon problème s'est résolu après que j'ai ajouté ça :

$mysqli->set_charset("utf8")


Edit (parsimonhi 03/06/22) : remplacement de "&gt;" par ">"
Modifié par parsimonhi (03 Jun 2022 - 06:11)
Alors, félicitation de l'avoir résolu toi-même.
Ça n'empêche, retiens l'épisode sur le .htaccess. Si un jour tu mets ton site en ligne, tu y seras forcément confronté.
Bonne continuation.