Probleme php et sql

bonjour,
alors la pour quelqu’un je dois toucher a du php et mysql or ca fait perpete que j’y ai pas touché et j’ai une erreur tres tres conne.
ce code marche :

[code]<?php
$host = “localhost”;
$user = “root”;
$pass = “”;
$bdd = “steph”;
$table = “test”;

// connection avec MySQL
@mysql_connect($host, $user, $pass) or die(“Impossible de se connecter à la base de données”);
// Le @ indique à php de ne pas afficher de message d’erreur
@mysql_select_db($bdd) or die(“Impossible de se connecter à la base de données”);
$sql = “SELECT * FROM " . $table .”;";//.“Where prenom=’”.$_POST[‘prenom’]."’;";
print $sql;
$res = mysql_query($sql) or die(‘Erreur SQL !’.$sql.’
’.mysql_error());
$valide = 0;
while($val = mysql_fetch_array($res)){ // parcours des resultats
if ($val[‘password’] == $_POST[‘password’] && $val[‘prenom’] == $_POST[‘prenom’])
{
$valide = 1;
}
}

if ($valide==1)
{
print “bon”;
}

mysql_close();
?>[/code]
or quand je remplace la ligne :

par :

cela merde la requete se passe bien mais elle ne renvoit rien.
Or :
Je suis sur que la table test contient un champs prenom

La merde vient de cette ligne toute conne :
Select * from test where prenom=‘test’;
cette ligne ne me renvoit rien alors que dans la table test il y a bien un champs prenom qui est égal a test.

Merci beaucoup
Bussiere

edit : erreur du where corrigé

a priori il manque un espace entre le nom de ta table et ton where.

Effectivement ça serait con. Cela dit c’est bizarre que la requête se passe sans problème si c’est ça. Il devrait y avoir une erreur du genre “table inconnue” non ?

non non c’est pas ca l’erreur.

J’ai vérifié déja.
merci
Bussiere

T’as testé la requête sans passer par le php ? (je connais pas mysql, mais il doit bien y avoir un truc intégré pour taper ses requêtes).

et un ptit echo sur ta requête tu verrais peut être un peu mieux quelle gueule elle a. Puis comme astro je testerais sou PhpMyAdmin ou autre.

j’ai déja fait un echo elle donne :
Select * from test where prenom=‹ test ›;

Mais bon ca m’enerve je vais continuer de chercher

Merci de votre aide

Bussiere

Avec mysql_query tu as pas besoin de mettre de ; à la fin… la fonction l’ajoute toute seule.

Si ca marche en ajoutant un ; apres $table, c’est que ca plante au niveau du where?

$sql = "SELECT * FROM " . $table .“Where prenom=’”.$_POST[‘prenom’];

un petit tips sinon:
Tu as pas besoin d’initialiser $valide au prealable en php.

il te suffit de laisser la ligne $valide=1 dans le test, et pour le test sur $valide, il te suffit de mettre if(isset($valide))

Que donne le code:

[…]
$sql = “SELECT * FROM " . $table .” Where prenom=’".$_POST[‘prenom’]." AND password = ".$_POST[‘password’];
print $sql;
$res = mysql_query($sql) or die(‘Erreur SQL !’.$sql.’
’.mysql_error());

$val = mysql_fetch_array($res);

if(isset($val[‘prenom’]))
echo “ok”;

mysql_close();
?>

essai ça :

Un echo() de $sql devrait retourner :
SELECT * FROM test WHERE prenom=“test”;

Si ça ne fonctionne toujours pas, remplace $_POST[‘prenom’] par “test”, si le test est concluant, regarde du coté de ton formulaire et des valeurs que tu récupères dans ton $_POST avec un foreach dessus.

Ah j’avais cru comprendre que le problème était résolu.

[quote=“nakira, post:8, topic: 36780”]Avec mysql_query tu as pas besoin de mettre de ; à la fin… la fonction l’ajoute toute seule.

Si ca marche en ajoutant un ; apres $table, c’est que ca plante au niveau du where?

$sql = "SELECT * FROM " . $table .“Where prenom=’”.$_POST[‘prenom’];

un petit tips sinon:
Tu as pas besoin d’initialiser $valide au prealable en php.

il te suffit de laisser la ligne $valide=1 dans le test, et pour le test sur $valide, il te suffit de mettre if(isset($valide))

Que donne le code:

[…]
$sql = “SELECT * FROM " . $table .” Where prenom=’".$_POST[‘prenom’]." AND password = ".$_POST[‘password’];
print $sql;
$res = mysql_query($sql) or die(‘Erreur SQL !’.$sql.’
’.mysql_error());

$val = mysql_fetch_array($res);

if(isset($val[‘prenom’]))
echo “ok”;

mysql_close();
?>[/quote]

Bravo pour ta performance, à coder comme un goret comme ça on comprend mieux pourquoi les web apps sont les premières failles sur des serveurs :flower:

[quote=« Jul16ar, post:9, topic: 36780 »]essai ça :

$sql = 'SELECT * FROM `'. $table .'` WHERE `prenom`="'. trim($_POST['prenom']) .'";';

Un echo() de $sql devrait retourner :
SELECT * FROM test WHERE prenom=« test »;

Si ça ne fonctionne toujours pas, remplace $_POST[‹ prenom ›] par « test », si le test est concluant, regarde du coté de ton formulaire et des valeurs que tu récupères dans ton $_POST avec un foreach dessus.[/quote]
Et une fois que c’est implemente dis nous le site ou c’est deploye qu’on puisse s’amuser :slight_smile:

On a pas dit qu’on faisait du secur là. On cherche simplement à faire fonctionner la requête SQL de Bussiere.
Là je lui propose une syntaxe SQL propre. Si cela ne fonctionne toujours pas, ça viendrait donc de son .
On aura bien le temps après de faire un topo sécurité, mais si on faisait d’abord les choses dans l’ordre :slight_smile: . C’est si facile d’arriver sur ses grand chevaux et faire un hors-sujet sécurité.

PS à bussiere : trim() sert juste à retirer les espaces en début et fin de chaîne, c’est pas vraiment utile, c’est juste que j’ai tendance personnellement à frapper la barre d’espace après chaque mot, ce qui est gênant dans les formulaires… (mais bon j’me soigne :crying:)

Non on fait les choses proprement des le depart sinon on oublie toujours un truc et ca finit en gros trou. Je code pas en PHP mais juste de lire du code comme il y en a plus haut, je suis desole mais perso ca me pique les yeux et ca fait grincer mes dents un truc de cochon pareil… si tu trouves que ca fait de moi un gros snob du code, tant pis :slight_smile: J’assume.

C’est pas une question d’arriver « sur ses grands chevaux » et c’etait pas dirige contre toi, t’as juste pris une ligne de l’horrible code et t’as suggere un changement donc c’etait pas la question meme si je t’ai quoté faut pas le prendre perso. Non c’est une question de respecter une certaine notion de « best practices » qui permettent d’ecrire du code propre et d’apprendre a faire les choses comme il faut des le depart. Sinon on finit avec le genre d’horreurs qu’il y a sur le premier message et que d’autre doivent se taper et maintenir parceque on a pas eut le temps de repasser derriere. « On rajoutera la securite et le code propre apres » c’est la meilleure maniere pour pas avoir de securite du tout. Faire les choses « dans l’ordre » c’est commencer par la justement. Et tant qu’a faire je vois pas pourquoi on lui monterait un exemple de code qui est ce qu’il ne faut absoluement pas faire… et c’est encore plus important si il debute…

Une maniere (et je connais pas bien php donc a confirmer), c’est de faire un bind_param avec un truc du genre (que je trouve perso autrement plus lisible en plus):

$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE); /* establish database connection */ $sql = "UPDATE users SET id = ? ,name = ? WHERE id = ? "; $stmt = $mysqli->prepare($sql); /* prepare statement */ $stmt->bind_param('isi', $this->id, $this->name, $this->id); /* bind parameters to statement */ $stmt->execute(); /* execute prepared statement */ $stmt->close(); /* close statement */ $mysqli->close(); /* closes connection */

Le premier param de bin_param c’est la liste des types des parametres, dans l’exemple donc: int, string, int.
Si il tourne avec un php qui a pas mysqli y a d’autre methodes.

Bon j’ai envoyé ca a la miss a qui j’ai filé un coup de main j’attends un retour.

Du coup j’ai commencé a faire une petite fonction de debug :

donc quelqu’un sait me dire pourquoi j’ai un probleme sur cette autre fonction a la con :

try { function debug($nom,$variable){ $fichier = fopen('debug.txt',"r+"); fputs($fichier, $nom.":".$variable."</n>"); fclose($fichier); } catch(Exception $e) { $e->getMessage(); $fichier = fopen('debug.txt',"w+"); fputs($fichier, $nom.":".$variable."/n"); fclose($fichier); } }
j’ai un :
unexpected T_CATCH in C:\wamp\www\debug.php5 on line 9

quand j’appel cette fonction. La je suis en train de me demander si c’est pas l’installation des wamp2 qui merde (je suis dans ua bahut (iad a louvain la neuve)) ou moi qui suis pas doué.

Bussiere

Pour moi ça me parait évident :

try { ---function debug($nom,$variable){ ------$fichier = fopen('debug.txt',"r+"); ------fputs($fichier, $nom.":".$variable."</n>"); ------fclose($fichier); ---} ---catch(Exception $e) { ------$e->getMessage(); ------$fichier = fopen('debug.txt',"w+"); ------fputs($fichier, $nom.":".$variable."/n"); ------fclose($fichier); ---} }

merci pour le compliment, le but n’etait pas de securiser le code mais de le tester :flower:

Je te rejoins sur ce point, d’où mon commentaire. (réponse au poste précédent de nikata)
par contre la version avec quote proposée par jul16ar si les entrées sont validées ne devrait pas poser de problèmes.

pour le try catch : je verrais plutôt :

[code]—function debug($nom,$variable){
------$status = file_put_contents(‹ debug.txt ›, $variable); // il manque un truc pour dire de pas over writter
------if(!$status) throw new Exception(‹ Erreur avec le fichier ou ce que tu veux ›);
return true;
—}

puis

try {
-------debug(‹ dump ›, $toto);
}

catch(Exception $e)
{
-------trigger_error($e);
}[/code]

Moi je verrais plutôt [codebox]function debug($msg)
{
$fichier = fopen(‘debug.txt’,“a+”);
fputs($fichier, $msg."\n");
fclose($fichier);
}

$bidule = false;

try {
if ($bidule == false)
{
throw new Exception(‘plop’);
}
echo($bidule);
}
catch (Exception $e)
{
debug($e->getMessage());
}[/codebox]Edit : L’idée c’est d’écrire les erreurs “catchées” dans un fichier avec la fonction debug(), pas de voir si la fonction debug() renvoie une erreur. Mais c’est un peu hors-sujet, faut mixer avec ce que propose fser.

le truc en fait c’est de verifier si le fichier existe ou pas.

De base on tente un ecrire on récupère l’exception si il n’existe pas on fait un créé plus ecrire.

merci
Bussiere

Sinon on utilise la fonction file_exists() qui sert justement à ça.

Le premier intérêt de PHP, c’est la multitude fonction qui permettent de faire un peu tout et surtout n’importe quoi à partir d’à peu près ce qu’on veut.
la seule utilité des exceptions dans ce contexte, c’est pour le cas où le fichier est supprimé entre le file_exists() et son ouverture, mais au vu de la propreté du code en question ça me parait déplacé.