Aller au contenu

mars073
 Share

Recommended Posts

Bonjour à tous,
Aujourd’hui je vais vous montrer comment coder un moteur de recherche de base, vous pouvez donc aussi bien améliorer la structure de vos tables que la condition de recherche elle même.
Contexte: Le moteur de recherche sert à trouver un joueur et afficher ses statistiques.

Structure table:

CREATE TABLE `players` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`name` varchar(255) NOT NULL,
	`guild` text NOT NULL,
	`token` int(11) NOT NULL,
	PRIMARY KEY (`id`)
) AUTO_INCREMENT=1 ;

Le formulaire de recherche (search.php):

<form action="./search.php" method="GET">
	<label for="name">Nom du joueur</label>
	<input type="text" name="name">
	<input type="submit" value="Rechercher">
</form>

Je ne m'attarde pas sur le html vu que c'est un tuto php/my-sql.

à la suite du code html vous allons ajouter du php:

<table width="100%">
<tr>
	<th>#</th>
	<th>Nom</th>
	<th>Points</th>
</tr>
<?php
	$page = 0;
	if (isset($_GET['name']) {
		$page = 1;	// Page par défaut affichée
		$np_page = 25;	// Nom de résultat par page
		$name = addslashes($_GET['name']); // suppression faille sql
		$icxn = mysqli_connect("127.0.0.1", "root", "toor", "game");	//connexion mySQLi

		// vérification du numéro de la page si elle est indiqué dans l'url en "?page=n"
		if (isset($_GET['page'])&&is_numeric($_GET['page'])&&
			$_GET['page']>0&&$_GET['page']<9999999) $page = $_GET['page'];
		$fourchette = ($page - 1) * $np_page;
		$iquery = mysqli_query($icxn, "SELECT * FROM `players` WHERE `name` LIKE '%$name%' ORDER BY `name` ASC LIMIT $fourchette, $np_page");
		while ($char = mysqli_fetch_array($iquery)) {
			echo <<<LINE
			<tr>
				<td>{$char['id']}</td>
				<td><b>{$char['name']}</b></td>
				<td>{$char['token']}</td>
			</tr>
LINE;
		}
	}
	?>
</table>
<?php
	if ($page!=0) {
		echo "page(s): ";
		$iquery_count = mysqli_query($icxn, "SELECT * FROM `players` WHERE `name` LIKE '%$name%'");
		$count = mysqli_nums_rows($iquery_count);
		for ($i = 1; $i < $count/$np_page; $i++) {
			echo '<a href="./search.php?page='.$i.'">'.$i.'</a>&nbsp;';
		}
	}
	?>

Conseil pour améliorer:
-Si la table est beaucoup avec votre moteur faite une colonne de plus où il y a une simplification des caractères (ex: "é" => "e"; "â" => "a"; etc).
-Attention aux caractères html utilisiez la fonction strip_tag() ou autre sur ce qui causer des faille xss par exemple si le client peu choisir le nom de son personnage et mettre du code html dedans c'est mort.
-Supprimez les caractères "%" et "_" si ils sont présent dans $name et instauré une limite au niveau du nombre de caractères pour la recherche exemple: minimum 4 caractères, pour évites de charger trop de chose.

Version pdo pour les gens qui aiment la pdo:

<table width="100%">
<tr>
	<th>#</th>
	<th>Nom</th>
	<th>Points</th>
</tr>
<?php
	$page = 0;
	if (isset($_GET['name']) {
		$page = 1;	// Page par défaut affichée
		$np_page = 25;	// Nom de résultat par page
		$name = $_GET['name'];
		$cxn = new PDO('mysql:host=127.0.0.1;dbname=game', 'root', 'toor'); 	//connexion mySQL

		// vérification du numéro de la page si elle est indiqué dans l'url en "?page=n"
		if (isset($_GET['page'])&&is_numeric($_GET['page'])&&
			$_GET['page']>0&&$_GET['page']<9999999) $page = $_GET['page'];
		$fourchette = ($page - 1) * $np_page;
		$query = $cxn->prepare("SELECT * FROM players` WHERE `name` LIKE '%:name%' ORDER BY `name` ASC LIMIT :fourchette, :npp");
 		$query->bindValue(':name', $name, PDO::PARAM_STR);
		$query->bindValue(':fourchette', $fourchette, PDO::PARAM_INT);
		$query->bindValue(':npp', $np_page, PDO::PARAM_INT);
		$query->execute();
		while ($char = $query->fetch()) {
			echo <<<LINE
			<tr>
				<td>{$char['id']}</td>
				<td><b>{$char['name']}</b></td>
				<td>{$char['token']}</td>
			</tr>
LINE;
		}
	}
	?>
</table>
<?php
	if ($page!=0) {
		echo "page(s): ";
		$query_count = $cxn->prepare("SELECT * FROM `players` WHERE `name` LIKE '%:name%'");
 		$query_count->bindValue(':name', $name, PDO::PARAM_STR);
		$query_count->execute();
		$count = $query_count->rowCount();
		for ($i = 1; $i < $count/$np_page; $i++) {
			echo '<a href="./search.php?page='.$i.'">'.$i.'</a>&nbsp;';
		}
	}
	?>

Bonne programmation à tous!
Cordialement,
Mars073

  • Upvote 3
Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

La tabulation est très médiocre sur l'affichage des messages. Mais bon, déjà l'éditeur de IPB est suffisemment bien, on va pas tout demander non plus.

Merci du partage, c'est du bon boulot. :)

Tu as tiré l'idée d'un projet perso ou ça t'es venu comme ça ?

+1 Rep.

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Vous avez collé du contenu avec mise en forme.   Supprimer la mise en forme

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Chargement
 Share

×
×
  • Créer...