[RESOLU] PHP tester avant insertion dans la base

Petit nouveau ! | 3 Messages

20 févr. 2017, 23:29

Bonjour JE tente d'eviter des doublons , je lance cette requete, mais ca ne marche pas
le message ci dessous si la requette est vide

Erreur SQL !
Resource id #4
$result = mysql_query('SELECT * FROM gestech WHERE EXISTS (SELECT * FROM gestech  WHERE date= "'.$formdate2.'" && tech="'.$_POST['tech_n1'].'" ) ');
$num_rows = mysql_num_rows($result) or die('Erreur SQL !<br>'.$result.'<br>'.mysql_error());;

if ($num_rows= 0) {
  // do something 
  echo' > ok';
}
else {
  // do something else
  echo' > Nok';   JE VOUDRAIS UNE REDIRECTION ICI

}

Merci pour vos éclaircissements

Mammouth du PHP | 1338 Messages

20 févr. 2017, 23:49

Pour quoi ne pas faire simplement :
$result = mysql_query('SELECT * FROM gestech  WHERE date= "'.$formdate2.'" AND tech="'.$_POST['tech_n1'].'"');
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Mammouth du PHP | 1227 Messages

21 févr. 2017, 01:54

pour une redirection, tu retire le echo et tu met header("location:pageDEredirection.php");
Attention à ce qu'il n'y ai encore aucune sortie html avant le header (même pas un espace ou un retour à la ligne avant <?php par exemple)
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

21 févr. 2017, 11:43

salut,

coté SQL fait plutôt un select count plutôt que de retourner une tonne d'enregistrement (même en fait pour rien). Ton select * fait que vas retourner toutes les colonnes alors qu'elle te servent a rien, tout comme le subselect ;)

Ton code est ouvert aux injections SQL c'est pas jolie jolie ;)
Voici un exemple de cela que peux donner.
<?php 
$sql = 'SELECT count(1) as nb FROM gestech  WHERE date= '.mysql_real_escape_string($formdate2).' && tech= '.mysql_real_escape_string($_POST['tech_n1']);

$result = mysql_query($sql);
if($result === false){
  // erreur à traiter par exemple avec mysql_error
}else {
  $data = mysql_fetch_assoc($result);
  // c'est important
  mysql_free_result($result);
  if($data['nb'] == 0){
    echo ' > ok';
  }else {
    header('Location: laoutuveux');
  }
}
// c'est important
mysql_close();

pour info l'extension mysql n'existe plus dans les dernière version de php il serait bon d'utiliser mysql ou PDO faq-tutoriels/passer-mysql-mysqli-pdo-t276282.html

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

21 févr. 2017, 13:23

Merci Moogli, c'est aussi simple que ca, mais y a des choses que je connait, pas
mysql_real_escape_string
J'ai du rajouter des balises "'.mysql_real_escape_string($formdate2).'"

ca 3 égals , j'avais jamais vu
=== false

Je ne maitrise pas beaucoup le php, j'ai encore du mal avec les tableaux. (pour vous dire)
Je manque de méthodologie, malgré apres plusieurs années de pratique. j'ai meme du mal a me souvenir de mes propres pages. Je fais ca en complément de mon activité, un peu le soir et le midi. Donc je progresse qu'a petit pas .
Je dis tout ca pour que vous soyez indulgent. :)

Merci de ton aide

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

21 févr. 2017, 15:57

ah oui j'ai gouré avec PDO ;)

évite les " pour une requêtes sql le séparateur des chaines de caractères c'est le '
=>
<?php
$sql = 'SELECT count(1) as nb FROM gestech  WHERE date= \''.mysql_real_escape_string($formdate2).'\' && tech= \''.mysql_real_escape_string($_POST['tech_n1']).'\'';

le triple égale c'est pour la comparaison de type.
en claire avec == tu as par exemple
false == 0
false == null
false == false
avec le triple égale seule le dernier cas est vrai.

on a aussi '2' == 2 qui est vrai mais '2' === 2 n'est pas vrai (chaîne de caractère VS entier). Cela fonctionne avec la différence ( '2' !== 2 est vrai ;) ).

pour le reste on est toujours en train d'apprendre ;)

@+
Il en faut peu pour être heureux ......