Aide pour un script php

[Résolu]
Signaler
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008
-
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
-
Bonjour a tous !

Voila j'explique ce que je voudrais que le script réalise :

-En ayant entré un nom de client ou un bout de nom dans un formulaire, il va chercher dans un fichier client.txt si le nom de client existe.
-En entrant un bout de nom, (c'est la mon gros problème), je voudrais qu'il m'affiche tout les noms commençant par les lettres tapées. Par exemple si je tappe "an", il devrait m'afficher André ou Anne !
-L'utilisateur choisit un des nom proposés et l'amène à la page suivante.
-Si les nom proposées ne correspondent pas a l'utilisateur, retour au formulaire de saisie.

Merci

14 réponses

Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Salut,

quel est le format de ton fichier client.txt ? Il n'y a que des nom de clients ou il y a aussi d'autres informations ?

Sinon, regarde à l'aide de ce que je viens de faire :

<?php

// les noms
$noms = 'andre,sonia,sophie,sophia,claire,claude,clementine,georges,grogory,methieu';
// le nom recherché
$name_post = strtolower('cl');

// METHODE N°1
$name_post_len = strlen($name_post);
$liste_noms = explode(',', strtolower($noms));
$return = array();

foreach( $liste_noms as $nom )
{
    if( $name_post == substr($nom, 0, $name_post_len) )
    {
        $return[] = $nom;
    }
}

print_r($return);

echo '<hr />';

// METHODE N°2
$return = array();

if( preg_match_all('`(' . $name_post . '(.[^,]*))`i', $noms, $matches, PREG_SET_ORDER) )
{
    foreach( $matches as $matche )
    {
        $return[] = $matche[1];
    }
}

print_r($return);

echo '<hr />';

?>
<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Euh, si il retourne toujours ça, c'est normal :
$name_post strtolower('cl');  -> $name_post strtolower(htmlspecialchars($_POST['client']));

Sinon, voici amélioré

$noms  = 'andre|1|2' . "\n";
$noms .= 'sonia|1|2' . "\n";
$noms .= 'sophie|1|2' . "\n";
$noms .= 'sophia|1|2' . "\n";
$noms .= 'claire|1|2' . "\n";
$noms .= 'claude|1|2' . "\n";
$noms .= 'clementine|1|2' . "\n";
$noms .= 'georges|1|2' . "\n";

// Séparateur : retour à la ligne
$liste_noms = explode( "\n" , strtolower($noms));
$return = array();

$name_post = strtolower(htmlspecialchars($_POST['client']));
$name_post_len = strlen($name_post);

foreach( $liste_noms as $nom )
{
    // Ici, on prend chaque ligne
    // Puis on ne garde que le nom, càd du début de la ligne au séparateur de donnée (ici |)
    $nom = substr($nom, 0, strpos($nom, '|'));
    if( $name_post == substr($nom, 0, $name_post_len) )
    {
        $return[] = $nom;
    }
}

print_r($return);

echo '<hr />';

$return = array();

if( preg_match_all( '`(' . $name_post . '([a-zA-Z0-9]*))`si' , $noms, $matches, PREG_SET_ORDER) )
{
    foreach( $matches as $matche )
    {
        $return[] = $matche[1];
    }
}

print_r($return);

<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Re,

voila une version différente :p
En rouge, à remplacé ;)
Chez moi, ca marche ^^

$noms  = '03123456;ANDRE;ETS ANDRE;rue des tests;54000 NANCY;
03654321;ANNE;ETS ANNE;rue des anes;88300 neufchateau;
03111111;BERNARD;ETS BERNARD;RUE ZEGZETG;54000 NANCY;
03999999;TEST;ETS TEST;RUE TEST;54000 TESTS;';

$liste_noms = explode("\n", strtolower($noms));
$return = array();

$name_post = strtolower('an');
$name_post_len = strlen($name_post);

foreach( $liste_noms as $nom )
{
    $first = strpos($nom, ';');
    $nom = substr($nom, $first + 1, strpos(substr($nom, $first + 1), ';'));
    if( $name_post == substr($nom, 0, $name_post_len) )
    {
        $return[] = $nom;
    }
}

print_r($return);

echo '<hr />';

$return = array();

if( preg_match_all('`^([0-9]+);(' . $name_post . '([a-zA-Z0-9]*));(.*)$`mi', $noms, $matches, PREG_SET_ORDER) )
{
    foreach( $matches as $matche )
    {
        $return[] = strtolower($matche[2]);
    }
}

print_r($return);

<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
^^

CF le message un peu plus au dessus : $name_post <gras>strtolower('an');  -> $name_post strtolower(htmlspecialchars($_POST['client']));</gras>

pareil avec
$noms = file_get_contents('mon_fichier.txt');
(ce qui est en rouge, quoi ^^)
<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Hum ...

Donc, tu récupère un Array (avec ANDRE, ANNE, ANIS, ANIESSE, ...)

Par contre, tu peux faire différente choses :
soit en javascript (mais peut être désactivé), soit avec un select (une liste de choix de client ; avantage, pas de limite), soit en posant des questions.

Pour les quetions (le plus contraignant à mon avis) tu fais un truc du genre :

$i = isset($_GET['i']) ? intval($_GET['i']) : 0;

if( isset($result[$i]) )
{
    echo 'Est-ce le bon client ? ', $result[$i];
    echo '
[[?client=', urlencode($result[$i]), ' OUI]] [[?i=', ($i+1), '&=', urlencode($result[$i]), '">NON]]';
}

Si c'est oui, on le redirige vers la page, sinon, on repose la question avec le nom suivant. Par contre, dans ce cas là, ce n'est plus :
$name_post = strtolower(htmlspecialchars($_POST['client']));

Mais :
$client = isset($_GET['client']) ? $_GET['client'] : $_POST['client'];
$name_post = strtolower(htmlspecialchars($client));

<hr size="2" width="100%" />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

j'ajoute mon code de départ pour vous éclairer un peu !

$contenu_du_fichier = file_get_contents('client.txt');
$noms = preg_replace('`[0-9]{8};([a-zA-Z0-9. ]+);(.+)`', '$1', $contenu_du_fichier); // utile en cas de nom d'entreprise different du nom du client

$client = $_POST['client'] ;
$noms = $contenu_du_fichier ;

if(stripos($noms, $client))
{
?><META HTTP-EQUIV="Refresh" CONTENT="1;URL=article.php"><?php
}
else
{
echo 'Le client n\'existe pas'."
";
?>[index.php Retour]<?php
}
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

Alors, non dans mon fichier .txt, il n'y a pas que des noms, il y a aussi leur adresses, nom de sociètés... etc

Sinon, avec tes méthodes, que je tape n'importe quel nom, il m'affiche :


Array
(
[0] => claire
[1] => claude
[2] => clementine
)
C'est deja un bon début, il faudrait "automatiser" le truc je pense !  Mais je vois pas trop comment ^^
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

J'arrive presque au but recherché, le seul problème c'est que je ne connais pas forcèment tout les noms disponible dans le fichier. Y'a t-il un moyen pour que cela fonctionne quand meme ?

En tout cas, merci de m'aider :D
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Hum, que veux-tu dire ?

En fait, tu peux faire $noms = file_get_contents('mon_fichier.txt'); ainsi tu récupère  ton fichier puis tu le parse (l'interprète).

Mon $noms était mon fichier à moi (pour ne aps en crée un).

Par contre, je pense qu'il aurait été préférable pour toi d'utiliser une base de donnée ... celà aurait été plus simple pour la gestion et la lecture (un simple LIKE 'nom%' aurait suffit ^^)
<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

En fait, mon fichier client.txt est un fichier que je me sers pour tester mon script. Mais après, il y aura des vrais noms de clients et il y en aura probablement pas mal, donc je me vois mal écrire tout les noms dans le script ^^.

Et je ne peux malheuresement pas utiliser une base de donnée, je dois faire ce qu'on me dit ^^

Avec la ligne : $noms = file_get_contents('mon_fichier.txt') , il m'affiche cela :
Array
(
[0] => ANDRE
[1] => ANDRE
[2] => ANCY
[3] => ANNE
[4] => ANNE
[5] => anes
[6] => ANCY
)

Mon fichier client.txt se compose comme cela :
03123456;ANDRE;ETS ANDRE;rue des tests;54000 NANCY;
03654321;ANNE;ETS ANNE;rue des anes;88300 neufchateau;
03111111;BERNARD;ETS BERNARD;RUE ZEGZETG;54000 NANCY;
03999999;TEST;ETS TEST;RUE TEST;54000 TESTS;

Je voudrais juste recuperer la 2e partie, c'est à dire Andre, Anne, Bernard ...
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

Oui là ça marche mais seulement avec des noms commençant par "an"  , donc même si on tape bernard par exemple il continuera d'afficher : 


Array
(
[0] => andre
[1] => anne
)

C'est ca le problème :-( !
J'espère que tu comprend mon problème ^^
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

Ah effectivement ça marche !
Gros merci d'avoir pris du temps pour m'aider !

Juste une dernière question et j'arrête de t'embeter ^^ :  Comment je peux faire pour n'en afficher qu'un par un ?
Par exemple je tape "an", il m'affiche André. là je met un message du style " Est-ce le bon client ? "
Si oui on passe à la suite , sinon il m'affiche Anne ( et si c'est encore non, on revient à la saisie )
Messages postés
34
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
25 juin 2008

Ok je vais m'inspirer de ça.
Merci pour tout !
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Ah, (j'avais pas répondu à totue la question ^^)
Si tu veux ne poser que X fois la question, tu fais une verification sur le $i

if( $i >= 2 )
{
    Header('Location: ...');
}
^^

bon courage ;)
<hr />Si ma reponse te convient, merci de l'accepter !