Faire une correspondance entre 1 variable et 1 table

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Faire une correspondance entre 1 variable et 1 table

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 08 avr. 2014, 19:00

Bon maintenant va falloir mettre la main à la pâte pour régler le reste.
Je te dirai bien de jeter tout ce qui suit dans la fonction...
Car tu fais à peu près n'importe quoi...

Tout ce que tu as à faire c'est récupérer le retour de fetch().
Si c'est false tu retournes ton texte d'erreur, sinon tu retournes l'index titre.

Re: Faire une correspondance entre 1 variable et 1 table

par blinz » 08 avr. 2014, 17:35

$req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
                            WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
                          ');
						  
						 
						  
    echo $req->execute(array('codePostIpUser'=>$codePostalIpUser)); // un echo pour vérifier que cela ne retourne pas false
	var_dump($req->fetch()); // on regarde ce que cela retourne
    $reponse = array();
Bon c'est que même bizar puisque ça me retourne ceçi:

LePin code postal :38850

1array(2) { ["titre"]=> string(7) "le dede" [0]=> string(7) "le dede" } Aucun titre ne correspond.

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 08 avr. 2014, 17:24

Bon donc la requête SQL est bonne c'est déjà ça.
Maintenant il ne reste plus qu'à rajouter des points dans le code PHP pour avoir plus d'infos.
echo "exécution de la requête. code_postal = $codePostalIpUser";
$req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
                            WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
                          ');
echo $req->execute(array('codePostIpUser'=>$codePostalIpUser)); // un echo pour vérifier que cela ne retourne pas false
var_dump($req->fetch()); // on regarde ce que cela retourne

Re: Faire une correspondance entre 1 variable et 1 table

par blinz » 08 avr. 2014, 14:35

Salut xTG,
bon en éxécutant la requête, il remplacant :codePostIpUserr par 38850 ( car j'ai mis un exemple en bdd avec ce code ci ).
Il ressort le résultat suivant

Affichage des lignes 0 - 3 ( 4 total, Traitement en 1.3292 sec)
SELECT publicite.titre
FROM publicite, villes_france
WHERE villes_france.ville_code_postal = publicite.postcode
AND publicite.postcode =38850
LIMIT 0 , 30


Il trouve bien le titre: dédé

Donc une erreur ailleurs mais où ? j'ai vérifier la syntaxe apparament pas de pbm de ce coté.....je désespère pourtant je pense pas être loin d'aboutir à ce projet

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 07 avr. 2014, 20:40

phpmyadmin n'exécute pas du PHP mais du SQL ! ;)
SELECT publicite.titre FROM publicite, villes_france WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
et remplaces :codePostIpUser par une valeur lors du test.

Re: Faire une correspondance entre 1 variable et 1 table

par blinz » 07 avr. 2014, 18:50

Merci c'est pas évident surtout pour un premier mais on s'adapte.
Donc voilà la req écuter ds PHPMYADMIN
$req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser '); 
il me trouve une erreur:



Erreur

Il semble qu'il y ait une erreur dans votre requête SQL. Le message ci-bas peut vous aider à en trouver la cause.

ERROR: Ponctuation invalide @ 13
STR: ->
SQL: $req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
');


Requête SQL: Documentation

$req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser ');

MySQL a répondu: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '$req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
' at line 1

Pour rapel:
$bdd = new PDO('mysql:host=domaine;dbname=mabase','user','password',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 07 avr. 2014, 17:38

Une nouvelle bouche à nourrir... Toutes mes condoléances...
Félicitations pour ce nouveau né. :)

Que donnes en résultat la requête si tu l'exécutes dans phpmyadmin ?

Re: Faire une correspondance entre 1 variable et 1 table

par yoann38 » 07 avr. 2014, 11:31

Dsl de l'absence mais vu que ma femme vien d'accoucher. c'est chaud chaud ....
Bref, j'ai regardé ce que tu mas dit et je l'ai appliquer, cependant toujours rien qui s'affiche enfin si: Aucun titre ne correspond alors.
Je n'arrive pas à récupérer le titre de ma table publicite.

As tu une solution s'il te plait ?
Merci encore

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 05 avr. 2014, 23:32

$val vaut $donees (au contraire de $donnees) qui n'existe en fait tout simplement pas.
Actives les affichages des Warnings dans ton php.ini cela t'aidera. ;)

Re: Faire une correspondance entre 1 variable et 1 table

par yoann38 » 05 avr. 2014, 19:37

Je me suis pris d'un façon différentes cependant j'ai un problème d'affichage sur la dernière variable de mon code, sur un echo de la variable suivante: $resultat = trouveTitre($data['ville_code_postal']);
EN BDD pour l'exemple j'ai :
id_publicite: 1
id_departement: 26
id_type_publicite: 7
photo: nom de la photo
titre: lesoleil
description: unephrasedetest
phone: 0476010203
email: un email
website: un url
street; une adresse
postcode: 38850

J'ai bien une colone postcode, tout est bien rempli donc où est le problème, merci à vous encore.
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$script = "http://www.ieducatif.fr/geoloc/geo.php?IP=";
$retour = file_get_contents($script.$ip);
echo $retour;
?>
   
<!-- récupération de l'adresse ip du visiteur et affichage de la ville -->
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$script = "http://www.ieducatif.fr/geoloc/geo.php?IP=";
$retour = file_get_contents($script.$ip);
?>
   
   
<?php

$sql = 'SELECT ville_code_postal FROM villes_france WHERE ville_nom_reel = "'.$retour.'"';
   

$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

$data = mysql_fetch_array($req);
   
   

mysql_free_result ($req);
mysql_close ();
?>
   

code postal :<br />
<?php echo $data['ville_code_postal']; ?>
<!-- Fin de procédure de récupération de l'adresse ip du visiteur ainsi que de son code postal -->
   
<?php

 function trouveTitre( $codePostalIpUser )
 {

    try
    {

        $bdd = new PDO('mysql:host=domaine;dbname=toto','user','mdp',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }
    catch(Exception $e)
    {

        die('Erreur: '.$e->getMessage());
   
    }
       

    $req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
                            WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
                          ');
    $req->execute(array('codePostIpUser'=>$codePostalIpUser));
    $reponse = array();

    for($i = 0; $donnees = $req->fetch(); $i++)
    {
        $reponse[$i] = $donnees['publicite.titre'];
    }
    $req -> closeCursor();

    $val = (count($donnees)>0)?$donees:FALSE;

    if($val)
    {
        foreach($val as $value)
        {
            return  $value;
        }
    }
    else
    {
        return  'Aucun titre ne correspond.';
    }
 }
    
 $resultat = trouveTitre($data['ville_code_postal']);
   
echo $resultat ;
    
?>

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 31 mars 2014, 19:24

$bdd est déclarée dans conndb.php ?
Si c'est le cas c'est un problème de portée de variable.
Ce n'est pas une globale et donc elle n'est pas accessible depuis la fonction.
Il faut la déclarer globale dans la fonction pour qu'il sache où la chercher.
$maVariable = "test";
function foo()
{
  global $maVariable;
  echo $maVariable;
}

foo();
Ou plus proprement en la passant en argument à ta fonction.
$maVariable = "test";
function foo($var)
{
  echo $var;
}

foo($maVariable);

Re: Faire une correspondance entre 1 variable et 1 table

par yoann38 » 30 mars 2014, 22:24

il est vrai que je devrais mettre à jour par pdo ou mysqli
mais ca devrai quand même marcher et ma base exite bien je l'importe avec un include au debut c'est pour ca que je ne comprends par l'erreur
J'ai remis le code complet
Merci de votre aide

<?php
//******PARAMETRE DE CONNEXION*********
include("conndb.php");

?>
 
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Document sans titre</title>
</head>
 
<body>
 
 
<!-- récupération de l'adresse ip du visiteur et affichage de la ville -->
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$script = "http://www.ieducatif.fr/geoloc/geo.php?IP=";
$retour = file_get_contents($script.$ip);
echo $retour;
?>
 
<!-- récupération de l'adresse ip du visiteur et affichage de la ville -->
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$script = "http://www.ieducatif.fr/geoloc/geo.php?IP=";
$retour = file_get_contents($script.$ip);
?>
 
 
<?php
// lancement de la requete
$sql = 'SELECT ville_code_postal FROM villes_france WHERE ville_nom_reel = "'.$retour.'"';
 
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
 
// on recupere le resultat sous forme d'un tableau
$data = mysql_fetch_array($req);
 
 
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
mysql_close ();
?>
 
<!-- et on affiche le code postal -->
code postal :<br />
<?php echo $data['ville_code_postal']; ?>
<!-- Fin de procédure de récupération de l'adresse ip du visiteur ainsi que de son code postal -->
 
<?php
 //instanciation de la fonction trouveTitre
 function trouveTitre( $codePostalIpUser )
 {
//Si tout va bien, on peut continuer
    //Ici je fais une requête préparée contre les ISQL
    //il y'a deux conditions une sur l'egalité des element des tables jointe et l'autre sur la variable recupérée
    //Pour plus de détails cf cours php (MATEO)
    $req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
                            WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
                          ');
    $req->execute(array('codePostIpUser'=>$codePostalIpUser));
    $reponse = array();
    //On fait une while habituellement mais moi je fais une for pour stocker les élément dans un tableau
    for($i = 0; $donnees = $req->fetch(); $i++)
    {
        $reponse[$i] = $donnees['publicite.titre'];
    }
    $req -> closeCursor();
    // Normalement $val est un tableau qui ne contiendra qu'un seul element
    //je fais un ternaire pour que tu aies le resultat ou alors un false en cas de non reponse
    $val = (count($donnees)>0)?$donees:FALSE;
    //Puiqu'en fait $val ne peut contenir qu'un seul titre on y va
    if($val)
    {
        foreach($val as $value)
        {
            return  $value;
        }
    }
    else
    {
        return  'Aucun titre ne correspond.';
    } 
 }
  
 $resultat = trouveTitre($data['ville_code_postal']);
 
echo $resultat ;
  
?>

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 30 mars 2014, 21:44

Ton problème vient du fait que $bdd n'existe pas.
PDO requiert une initialisation pour se connecter à la bdd.

Tu utilises plus haut le driver mysql.
Autant continuer à l'utiliser plutôt que de refaire une connexion à la bdd avec un autre driver.

Mais le mieux serait de migrer vers mysqli (les mêmes fonctions que mysql mais avec un i dedans pour la majorité des fonctions) ou bien PDO.
Car le driver mysql n'est plus maintenu et donc n'est pas exempt de failles de sécurité.

Re: Faire une correspondance entre 1 variable et 1 table

par yoann38 » 30 mars 2014, 19:45

Ah c'est vraiment tout con.
je le serais maitenant, merci
Tout à l'air de marcher sauf le retour en page web m'affiche :
Fatal error: Call to a member function prepare() on a non-object in /home/users6/l/lasortie/www/test.php on line 64
j'ai à cette ligne ma requete:
$req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
');

<!-- récupération de l'adresse ip du visiteur et affichage de la ville -->
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$script = "http://www.ieducatif.fr/geoloc/geo.php?IP=";
$retour = file_get_contents($script.$ip);
echo $retour;
?>
 
<!-- récupération de l'adresse ip du visiteur et affichage de la ville -->
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$script = "http://www.ieducatif.fr/geoloc/geo.php?IP=";
$retour = file_get_contents($script.$ip);
?>
 
 
<?php
// lancement de la requete
$sql = 'SELECT ville_code_postal FROM villes_france WHERE ville_nom_reel = "'.$retour.'"';
 
// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
 
// on recupere le resultat sous forme d'un tableau
$data = mysql_fetch_array($req);
 
 
// on libère l'espace mémoire alloué pour cette interrogation de la base
mysql_free_result ($req);
mysql_close ();
?>
 
<!-- et on affiche le code postal -->
code postal :<br />
<?php echo $data['ville_code_postal']; ?>
<!-- Fin de procédure de récupération de l'adresse ip du visiteur ainsi que de son code postal -->
 
<?php
 //instanciation de la fonction trouveTitre
 function trouveTitre( $codePostalIpUser )
 {

    $req = $bdd->prepare('SELECT publicite.titre FROM publicite, villes_france
                            WHERE villes_france.ville_code_postal = publicite.postcode AND publicite.postcode = :codePostIpUser
                          ');
    $req->execute(array('codePostIpUser'=>$codePostalIpUser));
    $reponse = array();

    for($i = 0; $donnees = $req->fetch(); $i++)
    {
        $reponse[$i] = $donnees['publicite.titre'];
    }
    $req -> closeCursor();

    $val = (count($donnees)>0)?$donees:FALSE;

    if($val)
    {
        foreach($val as $value)
        {
            return  $value;
        }
    }
    else
    {
        return  'Aucun titre ne correspond.';
    } 
 }
  
 $resultat = trouveTitre($data['ville_code_postal']);
 
echo $resultat ;
  
?>

Re: Faire une correspondance entre 1 variable et 1 table

par xTG » 30 mars 2014, 19:35

echo écrit sur la réponse HTTP.
Son retour ne peut donc pas être stocké dans une variable ou bien retourné en sortie de fonction.
return $value;
return "un texte";
return 0;