Page 1 sur 2

une ignorance dans la recherche ds ma base sql

Posté : 16 oct. 2005, 23:01
par pascal denn
Bonsoir,

voila le debut d'un script -car je commence avec la gestion de base sql.
<?php
// connexion base sql
$hotedb='xxxxx';
$basedb='xxxxx';
$userdb='xxxxxx';
$passdb='xxxxxx';
$cnx=mysql_connect($hotedb,$userdb,$passdb);
$ret=mysql_select_db($basedb);
$req="SELECT loginperso01,passeperso01 FROM membres WHERE loginperso01";
$ret=mysql_query($req) or die (mysql_error ());
while ($col=mysql_fetch_row($ret))
?>
on arrive sur ce scrit en ayant rentré le login et le passe a travers la fonction post.
je voudrais que mon script lise ma table dans ma base sql composée de trois champs (login-passe-et mail).
et lorsqu'il trouve le login et le bon passe il renseigne la variable a$=login et b$=passe et si il ne trouve rien il ferme la connextion et retourne a l'index.

merci pour votre aide

Re: une ignorance dans la recherche ds ma base sql

Posté : 16 oct. 2005, 23:13
par ouckileou
je te conseille d'aller sur www.phpdebutant.org et de regarder quelques tutos :
voici les étaps à suivre :
- récupérer les variables du formulaire POST
- construire ta requête sql en les insérant (ici tu donnes un colonne dans le WHERE mais tu ne lui donne pas de valeur à chercher)
- récupérer les données trouvées (s'il y en a ) dans 2 variables
- spécifier les actions à faire si aucune ligne n'est retournée par la requête

il doit normalement y avoir sur le site des petits tutos simples correspondant à chaque étape, fais quelques essais et reviens poster ton code si tu as des problèmes ;)

reponse

Posté : 16 oct. 2005, 23:16
par pascal denn
thks

reponse

Posté : 16 oct. 2005, 23:30
par pascal denn
rebonsoir,

bon voila j'ai rectifie mon script mais par contre il est pas au top j'ai une erreur et rien ne s'affiche.

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /xxxx/ on line 12.
<?php
// connexion base sql
$hotedb='xxxx';
$basedb='xxxx';
$userdb='xxxxxx';
$passdb='xxxxxx';
$loginperso02 = isset($_POST['login']) ? $_POST['login'] : "";
$passeperso02 = isset($_POST['passe']) ? $_POST['passe'] : "";
$cnx=mysql_connect($hotedb,$userdb,$passdb);
mysql_select_db("$basedb",$cnx);
$req=mysql_query("SELECT loginperso03,passeperso03 FROM membres",$cnx);
while($col=mysql_fetch_array($req))
{
if ($loginperso02 == $loginperso03 && $passeperso02 == $passeperso03)
          {
            $a=$loginperso03;
			echo $a;
			}
			  
}
?>

merci pour votre aide.

Posté : 16 oct. 2005, 23:35
par Truc
SAlut, un conseil pour tres raidement voir le pourquoi du comment du plantage de la requete est de l'afficher comme ceci:
$sql="SELECT loginperso03,passeperso03 FROM membres";
echo $sql;
$req=mysql_query($sql,$cnx);
as tu bien des champs només loginperso03,passeperso03 et /ou la table membresdans la BD?

reponse

Posté : 16 oct. 2005, 23:47
par pascal denn
re,

par contre mon script pour verifier si le champs loginperso est bon ou pas.

merci

Posté : 16 oct. 2005, 23:58
par Truc
voila un exemple (rapidement):
<?
$sql="SELECT loginperso03 ,passeperso03 FROM membres WHERE loginperso03='".$loginperso02."' AND passeperso03='".$passeperso02."' ";
$req=mysql_query($sql,$cnx);
if($col=mysql_fetch_array($req))
{ 
   echo 'Membre trouvé';
   echo $col['loginperso03'].'<br>';
   echo $col['passeperso03'];
}
else echo 'pseudo ou passe inconnus';
pour des champs loginperso03 ,passeperso03 de la table membres

reponse

Posté : 17 oct. 2005, 00:10
par pascal denn
Re et merci pour ta reponse.

mais j'ai encore une erreur du type :

Parse error: parse error, unexpected T_STRING in /xxxx/ on line 11



<?php
// connexion base sql
$hotedb='xxxx';
$basedb='xxxx';
$userdb='xxxx';
$passdb='xxxxxx';;
$loginperso02 = isset($_POST['login']) ? $_POST['login'] : "";
$passeperso02 = isset($_POST['passe']) ? $_POST['passe'] : "";
$cnx=mysql_connect($hotedb,$userdb,$passdb);
mysql_select_db("$basedb",$cnx);
$sql=SELECT loginperso01 ,passeperso01 FROM membres WHERE loginperso01='".$loginperso02."' AND passeperso01='".$passeperso02."' ";
$req=mysql_query($sql,$cnx);
if($col=mysql_fetch_array($req)) 
{ 
   echo 'Membre trouvé'; 
   echo $col['loginperso01'].'<br>'; 
   echo $col['passeperso01']; 
} 
else echo 'pseudo ou passe inconnus';
merci encore

Posté : 17 oct. 2005, 00:12
par Truc
Il manque un " apres $sql=
$sql="SELECT loginperso01 ,passeperso01 FROM membres WHERE loginperso01='".$loginperso02."' AND passeperso01='".$passeperso02."' ";

reponse

Posté : 17 oct. 2005, 00:22
par pascal denn
merci cela fonctionne -
mais maintenant j'ai le probleme :

Warning: Cannot modify header information - headers already sent by (output started at /xxx//connextion.php:15) in /xxx//index.php on line 25

sur le fichier index.php qui appele par un include le script connexion.php(que tu as corrigé).

mais depuis que j'ai rajouté l'include j'ai cette erreur.
<?php 
session_start (); 
// On définit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez très bien interroger votre base de données afin de savoir si le visiteur qui se connecte est bien membre de votre site 
// $login_valide = "xxxx"; 
// $passe_valide = "xxxxxx";
include("connextion.php"); 
$login = isset($_POST['login']) ? $_POST['login'] : ""; 
$passe = isset($_POST['passe']) ? $_POST['passe'] : ""; 
// on teste si nos variables sont définies 
if (!empty($login) && !empty($passe)) 
{ 
    // on vérifie les informations du formulaire, à savoir si le pseudo saisi est bien un pseudo autorisé, de même pour le mot de passe 
    if ($login_valide == $login && $passe_valide == $passe) 
    { 
        // dans ce cas, tout est ok, on peut démarrer notre session 
        // on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables) 
        $_SESSION['login'] = $login; 
        $_SESSION['passe'] = $passe; 
        // on redirige notre visiteur vers une page de notre section membre 
        header("location:./membre.php"); 
    } 
    else 
    { 
        // Le visiteur n'a pas été reconnu comme étant membre de notre site. On utilise alors un petit javascript lui signalant ce fait 
        header("location:./pasmembre.php"); 
; 
    } 
} 
else 
{ 
header("location:./pasmembre.php"); 
} 
?>
comme maintenant il c retrouvé un login je voudrais le garder en memoire dans une session dans la page index.php


merci encore

reponse

Posté : 17 oct. 2005, 00:49
par pascal denn
re,

voila j'ai modifié mon script mais il merde encore au niveau du header.
<?php
session_start (); 
// connexion base sql
$nomsession='$loginperso02';
$hotedb='xxxx';
$basedb='xxxx';
$userdb='xxxx';
$passdb='xxxx';
$loginperso02 = isset($_POST['login']) ? $_POST['login'] : "";
$passeperso02 = isset($_POST['passe']) ? $_POST['passe'] : "";
$cnx=mysql_connect($hotedb,$userdb,$passdb);
mysql_select_db("$basedb",$cnx);
$sql="SELECT loginperso01,passeperso01 FROM membres WHERE loginperso01='".$loginperso02."' AND passeperso01='".$passeperso02."' ";
$req=mysql_query($sql,$cnx);
if($col=mysql_fetch_array($req)) 
{ 
   echo 'Membre trouvé '; 
   echo $col['loginperso01'].'<br>'; 
   echo $col['passeperso01'];
        $_SESSION['login001'] = $login; 
        $_SESSION['passe001'] = $passe; 
        header("location:./membre.php");
} 
else echo 'pseudo ou passe inconnus';
header("location:./pasmembre.php"); 
?>
message d'erreur
Warning: Cannot modify header information - headers already sent by (output started at /xxxx/index.php:17) in /xxxx//index.php on line 26

Warning: Cannot modify header information - headers already sent by (output started at /xxx//index.php:17) in /xxxx//index.php on line 29

merci

Posté : 17 oct. 2005, 09:00
par Cyrano
Tu ne peux pas utiliser header() si tu as envoyé quoique ce soit vers le navigateur: Or deux lignes avant le header(), tu as echo().... COmmente-les ou vire les complètement et reteste.

Posté : 17 oct. 2005, 09:28
par sadeq
Quand on envoi un header, le code précédent cette instruction ne doit envoyer aucun affichage ni par print, ni par echo ni par include d'un texte HTML ou d'un programme PHP qui fait de l'affichage.

De la même, un header doit être la dernière instruction d'un scoop ou bloc. On le retrouve généralement à la fin d'un bloc d'une alternative "if" ou "switch" ou tout simplement à la fin d'un programme.
Pourquoi? ben, tout simplement parceque header est une redirecteur qui donne la main au chargement d'une autre page (on dit qu'il envoi une requête HTTP au client navigateur) et donc forcement le programme en cours s'arrête.
On peut dire que header termine le programme actuel en appelant une autre page.

Dans ton premier exemple complet, un include précédant ton header l'empêche de bien fonctionner et dans le deuxième ce sont les echos qui provoquent l'échec du header.

La solution : quand to code doit décider d'un header avec une alternative, les affichages ne doivent se faire que dans le cas contraire de celui qui doit provoquer le header.

Par exemple:
dans le cas de validation d'une connexion, il faut respecter l'algorithme suivant:
1. Recevoir les paramètres éventuellement envoyés : login et mot de passe
2. Si il y a reception de valeurs : vérifier si le membre existe : si oui alors envoyer le header vers la page d'accueil du membre

3. dans tous les cas contraires à la validité du membre : envoyer un message d'avertissement tout en restant sur la même page de connexion

cet algorithme s'écrit exactement comme ton code à l'exception que cette correction tient compte de la présence d'un hearder
<?php 
session_start (); 
// On définit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez très bien interroger votre base de données afin de savoir si le visiteur qui se connecte est bien membre de votre site 
// $login_valide = "xxxx"; 
// $passe_valide = "xxxxxx"; 

//1. Recevoir les paramètres
$login = isset($_POST['login']) ? $_POST['login'] : ""; 
$passe = isset($_POST['passe']) ? $_POST['passe'] : ""; 
// on teste si nos variables sont définies 
if (!empty($login) && !empty($passe)) 
{ 
    //2. on vérifie les informations du formulaire, à savoir si le pseudo saisi est bien un pseudo autorisé, de même pour le mot de passe 
    if ($login_valide == $login && $passe_valide == $passe) 
    { 
        // dans ce cas, tout est ok, on peut démarrer notre session 
        // on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables) 
        $_SESSION['login'] = $login; 
        $_SESSION['passe'] = $passe; 
        // on redirige notre visiteur vers une page de notre section membre 
        header("location: membre.php"); 
    } 
    else 
    { 
        // Le visiteur n'a pas été reconnu comme étant membre de notre site.  
       $message = "Vous n'êtes pas autorisé!"; 
    } 
} 
else 
{ 
$massage = "Saisissez un mot et mot de passe!";
}

//Affichage de la page en cours : CONNEXION
include("connextion.php"); 
//Affichage du message d'avertissement
echo $message;
?>
Remarque: Une page PHP ne doit pas envoyer un header qui pointe sur elle même, c'est un abus qui présente un rique de bouclage infini qui bloque le navigateur et occupe le serveur. En plus du fait qu'aucun affichage ne peut se faire par une telle page.

Ceci dit je te conseille de lire un petit peu la doc sur les notions PHP de :
- POST/GET
- SESSION
- ECHO/PRINT
- HEADER
- INCLUDE

et SQL:
- SELECT sans WHERE
- SELECT avec WHERE

reponse

Posté : 17 oct. 2005, 10:22
par pascal denn
Merci encore pour votre aide....

j'ai regardé plusieurs docs j'ai modifié le script mais g tjrs un probleme mm si je commence a voir le bout du tunnel.

il execute le script et mm si je rentre le bon login et passe il ouvre la la page pasmembre.

merci pour votre aide
<?php
session_start (); 
// connexion base sql
$nomsession='$loginperso02';
$hotedb='xxxxx;
$basedb='xxxxx';
$userdb='xxxxxx';
$passdb='xxxxxx';
$loginperso02 = isset($_POST['login']) ? $_POST['login'] : "";
$passeperso02 = isset($_POST['passe']) ? $_POST['passe'] : "";
$cnx=mysql_connect($hotedb,$userdb,$passdb);
mysql_select_db("$basedb",$cnx);
$sql="SELECT loginperso01,passeperso01 FROM membres WHERE loginperso01='".$loginperso02."' AND passeperso01='".$passeperso02."' ";
$req=mysql_query($sql,$cnx);
if($col=mysql_fetch_array($req)) 
{ 
        $_SESSION['login001'] = $login; 
        $_SESSION['passe001'] = $passe;
header("location:./membre.php");
} 
header("location:./pasmembre.php"); 
?>

Posté : 17 oct. 2005, 10:53
par Cyrano
Le même code corrigé, explication ensuite:
<?php
session_start ();

/* Paramètres de connexion */
$hotedb = 'xxxxx';
$basedb = 'xxxxx';
$userdb = 'xxxxxx';
$passdb = '7dAZqGjv';

/* Récupération des valeurs envoyées du formulaire */
$loginperso02 = isset($_POST['login']) ? $_POST['login'] : "";
$passeperso02 = isset($_POST['passe']) ? $_POST['passe'] : "";

/* On vérifie qu'on a bien des valeurs */
if(!empty($loginperso02) && !empty($passeperso02))
{
    /* Établissement de la connexion avec le serveur MySQL */
    $cnx = mysql_connect($hotedb,$userdb,$passdb);
    mysql_select_db("$basedb",$cnx);

    /* Création de la requête SQL */
    $sql="SELECT COUNT(*) FROM membres WHERE loginperso01='". $loginperso02 ."' AND passeperso01='". $passeperso02 ."' ";
    /* Exécution de la requête */
    $req = mysql_query($sql,$cnx);

    if(mysql_fetch_result($req, 0) == 1)
    {
        $_SESSION['login001'] = $loginperso02;
        $page = "./membre.php";
    }
    else
    {
        $page = "./pasmembre.php";
    }
}
else
{
    $page = "./pasmembre.php";
}
header("location:". $page);
?>
Primo, c'est quoi cette variable établie juste après le session_start() ?? elle ne sert à rien, on vire;

Ensuite, au lieu de récupérer les valeurs de la base, tu as juste besoin de savoir si elles sont présentes: un COUNT suffit:

À la récupération, tu vérifies si le retour te donne bien 1 (et pas autre chose :

On enregistre JAMAIS un mot de passe dans une variable de session. Donc on ne garde que le pseudo;

Enfin, on met le header() vers la page pasmembre.php dans un else.

Essaye tout ça et reviens avec le résultat :)

Note: J'ai édité ton message, tu avais laissé un mot de passe en clair dedans, même si on a pas l'adresse, si un futé la trouve, tu vas avoir des surprises.