Kommunauty
Connexion
Inscription

Requête SQL qui s’exécute pas :/


db77 Messages : 79

Ok, merci de l'info, ça permet de comprendre

vendredi 25 janvier 2013

Miya Messages : 9

Salut,

j'ai parcouru un peu le code car même si le sujet semble résolu, tu devrais le relire avant de le mettre en ligne. Plusieurs petits trucs me semblent "bizarres":

if (isset($_POST['titre']) AND isset($_POST['contenu']) AND isset($_POST['type']) AND isset($_POST['id_item']) AND isset($_POST['nb_item']) AND isset($_POST['img']) AND isset($_POST['cost']))

Tu commences par vérifier si le formulaire a bien été envoyé cependant tu ne vérifies pas si les données envoyées ne sont pas vides! Un exemple peut aider à comprendre:

Exemple:


$_POST['titre'] = "test";
if (isset($_POST['titre'])) {
   echo "Requête SQL exécutée! Le titre est: {$_POST['titre']}";
} else {
   echo "Requête SQL annulée!";
}

Résultat:

"Requête SQL exécutée! Le titre est: test"

Essayons maintenant de ne pas mettre de titre afin de voir si la requête est bien annulée:


$_POST['titre'] = "";
if (isset($_POST['titre'])) {
   echo "Requête SQL exécutée! Le titre est: {$_POST['titre']}";
} else {
   echo "Requête SQL annulée!";
}

Résultat:

"Requête SQL exécutée! Le titre est: "

Or ce n'est généralement pas ce que l'on veut... Il faut ajouter un test en plus du isset afin de savoir si la variable n'est pas vide:

$_POST['titre'] = "";
if (isset($_POST['titre']) && !empty($_POST['titre'])) {
   echo "Requête SQL exécutée! Le titre est: {$_POST['titre']}";
} else {
   echo "Requête SQL annulée!";
}

Résultat:

"Requête SQL annulée!"

Voilà pour le premier point.

Le second point se trouve un peu plus bas:


if ($_POST['id_news'] == 0) {
  ...INSERT...
} else {
  ...UPDATE...
}

N'oublie pas qu'il ne faut jamais faire confiance à un utilisateur. Ici tu ne prévois pas le cas où $_POST['id_news'] serait < 0 par exemple ou ne serait pas un nombre mais une chaîne de caractères, que se passerait-il si c'était le cas? Il faut penser à toutes les éventualités et se protéger au maximum...

Troisième point:

$_POST['id_news'] = addslashes($_POST['id_article']);
              mysql_query("UPDATE boutique SET
                titre='" . $titre . "',
                contenu='" . $contenu . "',
                type='" . $type . "',
                id_item='" . $id_item . "',
                nb_item='" . $nb_item . "',
                img='" . $img . "',
                cost='" . $cost . "'
                WHERE id=
                '" . $_POST['id_article'] . "'
                ");

Pourquoi essayer de "sécuriser" un minimum $_POST['id_article'] si tu ne l'utilises pas par la suite?

Ce que tu fais équivaut à ça:

$phrase1 = "J'ai une chaîne de caractères à échapper<br />";
echo $phrase1;
$phrase2 = addslashes($phrase1);
echo $phrase1;

Résultat:

J'ai une chaîne de caractères à échapper

J'ai une chaîne de caractères à échapper

Or c'est $phrase2 qui est sécurisée et qu'il faut donc utiliser!

Résultat avec $phrase2:

J'ai une chaîne de caractères à échapper

J\'ai une chaîne de caractères à échapper

=> L’apostrophe a bien été échappée.

Avant dernier point:

if (isset($_GET['supprimer_article']))
      {
          $_GET['supprimer_article'] = addslashes($_GET['supprimer_article']);
          mysql_query('DELETE FROM boutique WHERE id=\'' . $_GET['supprimer_article'] . '\'');
      }

En gros, quelque soit la valeur de $_GET['supprimer_article'], tu vas chercher à supprimer l'article (que $_GET['supprimer_article'] soit un nombre ou une chaîne de caractères, positif ou négatif etc...). C'est un peu dangereux tu ne trouves pas...?

Pour terminer:

La concaténation pose souvent problème et on a vite fait d'oublier une quote, double quote dans un coin, ça peut être très très chiant à retrouver comme erreur sur de gros projets.


$var1 = "Je";
$var2 = "fais";
$var3 = "un test";

echo "'$var1', '$var2', '$var3'";

echo "<br />équivaut à:<br />";

echo "'".$var1."', '".$var2."', '".$var3."'";

Résultat:

'Je', 'fais', 'un test'

équivaut à:

'Je', 'fais', 'un test'

Premier test: 2 doubles quotes + 6 simples quotes

Deuxième test: 8 doubles quotes + 6 simples quotes

De plus, les quotes/double quotes ne sont utiles que si tu utilises une chaîne de caractères, ce n'est pas le cas si tu as un entier à tester par exemple si j'écris:


$var1 = "Je";
$var2 = 5;
$var3 = "un test";

echo "'$var1', $var2, '$var3'";

echo "<br />n'est pas équivalent à:<br />";

echo "'".$var1."', '".$var2."', '".$var3."'";

Résultat:

'Je', 5, 'un test'

n'est pas équivalent à:

'Je', '5', 'un test'

En effet, le 5 est un entier et doit être considéré comme un entier et non comme une chaîne de caractères ou un caractère.

Pour ce qui est du débat des doubles ou simples quotes, tu peux regarder sur google après un benchmark histoire de voir lequel est plus rapidement traité mais vu l'utilisation, tu peux t'en passer.

Dernière petite chose après j'arrête:

Exemple:

echo 'DELETE FROM boutique WHERE id=\'' . $_GET['supprimer_article'] . '\'';

Je suppose que l'id est un nombre donc pas de quotes/double quotes et je peux utiliser les accolades pour ne pas être embêté avec les quotes entre crochets. Je peux quand même concaténer si tu y tiens vraiment, y'a plusieurs façons de faire:


$_GET['supprimer_article'] = 5;

echo 'WHERE id=\'' . $_GET['supprimer_article'] . '\'';
echo "<br />";
// OU
echo "WHERE id={$_GET['supprimer_article']}";
echo "<br />";
// OU ENCORE
echo "WHERE id=".$_GET['supprimer_article'];
echo "<br />";
// OU ENCORE
echo 'WHERE id='.$_GET["supprimer_article"];

Résultat:

WHERE id='5'

WHERE id=5

WHERE id=5

WHERE id=5

Seul le premier résultat (le tien) est différent de ce fait.

Voilà, j'espère que ça pourra servir et aussi que je n'ai pas écris trop de conneries, j'suis fatigué, j'ai mal dormi... Si c'est le cas, n'hésitez pas à me faire la remarque et j'éditerai bien évidemment.

[PS]: Regarde du côté de fonctions comme mysql_real_escape_string ou encore PDO pour sécuriser...

Bonne aprem!

vendredi 25 janvier 2013

realityfree Messages : 53

Ses exact merci infiniment.

vendredi 25 janvier 2013

db77 Messages : 79

J'ajouterai simplement quelques remarques :

Premier point

Perso, les tests de contenu, je les exécute côté client pour éviter les aller-retour client-serveur.

Maintenant tout dépend des zones de saisie "obligatoires" qu'il souhaite récupérer...

Deuxième point

Le champ id_news n'apparaît nulle part dans son formulaire (ou j'ai mal vu) et donc c'est lui qui le gère et il est donc le seul à savoir si le test sur l'égalité à zéro est suffisant ou pas, d'autant plus que si PAR EXEMPLE pour 0 c'est un insert, pour 1 c'est un update, pour 3 c'est un delete, alors il convient de tester l'égalité stricte.

Troisième point :

Chacun fait comme il veut, perso, je concatène avec le point car je vois mieux (mais ça fait plus de 30 ans que je suis développeur donc j'ai mes habitudes )

Dernière chose :

Effectivement un ID est, NORMALEMENT (si tout a été fait dans les règles de l'art), numérique et unique.

samedi 26 janvier 2013

realityfree Messages : 53

Le champs id_news, et en type hidden merci de ton aide sa va beaucoup m'aider à apprendre un peut plus PHP

dimanche 27 janvier 2013

db77 Messages : 79

Pourtant, dans le code de ton formulaire, il n'y est pas.

<form class="form-signin" action="index.php" method="post">
<!-- LE SEUL CHAMP HIDDEN EST CELUI-CI -->
        <input type="hidden" name="id_article" value="<?php echo $id_article; ?>" />
</form>

Et id_article ce n'est pas id_news.

Essaye d'être plus rigoureux.

dimanche 27 janvier 2013 (Dernière édition dimanche 27 janvier 2013)

realityfree Messages : 53

Oui ^-^ j'ai éditer merci .

lundi 28 janvier 2013

Miya Messages : 9

Et id_article ce n'est pas id_news.

A un moment dans le code tu as une affectation qui se promène, je pense que c'est pour ça qu'il pensait qu'il s'agissait du champs hidden:

$_POST['id_news'] = addslashes($_POST['id_article']);

Je suis d'accord avec toi db77 et aussi le gros conseil pour t'améliorer realityfree:

Essaye d'être plus rigoureux.

lundi 28 janvier 2013

db77 Messages : 79

Euh, pas sûr du tout de ce que tu dis Miya...

Vu que dans son code (premier message posté), il y a ça :

if (isset($_POST['titre']) AND isset($_POST['contenu']) AND isset($_POST['type']) AND isset($_POST['id_item']) AND isset($_POST['nb_item']) AND isset($_POST['img']) AND isset($_POST['cost']))

{

$titre = addslashes($_POST['titre']);

$contenu = addslashes($_POST['contenu']);

$type = addslashes($_POST['type']);

$id_item = addslashes($_POST['id_item']);

$nb_item = addslashes($_POST['nb_item']);

$img = addslashes($_POST['img']);

$cost = addslashes($_POST['cost']);

if ($_POST['id_news'] == 0)

Je ne vois aucune affectation avant le test...

Il compare directement la variable postée du formulaire.

lundi 28 janvier 2013 (Dernière édition lundi 28 janvier 2013)

Miya Messages : 9

Oui, on s'est juste mal compris, dans le else, il a fait un bidouillage pour le $_POST['id_news'] et il n'y a qu'à cet endroit qu'il apparaît, c'est pour cela que j'y faisais référence, je ne disais pas du tout que c'était justifié:


          else
          {
              $_POST['id_news'] = addslashes($_POST['id_article']);
              mysql_query("UPDATE boutique SET
                titre='" . $titre . "',
                contenu='" . $contenu . "',
                type='" . $type . "',
                id_item='" . $id_item . "',
                nb_item='" . $nb_item . "',
                img='" . $img . "',
                cost='" . $cost . "'
                WHERE id=
                '" . $_POST['id_article'] . "'
                ");
          }
      }

Bref, y'a pas mal de soucis de logique, de programmation et de sécurité dans ce code.

lundi 28 janvier 2013

Page suivante »