[PHP] j'arrive pas a faire une simple requette mysql ??

j'arrive pas a faire une simple requette mysql ?? [PHP] - PHP - Programmation

Marsh Posté le 28-03-2003 à 23:10:09    

j'ai fait un ptit compteur, mais il marche pas et il m'affiche pas de message d'erreur...
alors je test avec une requette simple :
 

Code :
  1. <?php
  2. mysql_connect("localhost", "root", "" );
  3. mysql_select_db("bdd" );
  4. $current_ip =  $_SERVER['HTTP_X_FORWARDED_FOR']  ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
  5. mysql_query("INSERT INTO counter-ip (ip, date) VALUES ($current_ip, NOW())" );
  6. mysql_close();
  7. ?>


 
mais ca marche pas non+ ! il ne met rien  dans ma table ! (j'ai aussi testé avec encore +simple mais rien non+)
je comprend pas... je fait une erreur kek part ? j'ai mal configuré easyPHP ??
merci

Reply

Marsh Posté le 28-03-2003 à 23:10:09   

Reply

Marsh Posté le 28-03-2003 à 23:32:10    

le nom de ta table n'est pas standard.
 
cherche le caractère d'échappement de MySQL.
 
Sous Oracle, c'est le guillement "..." et sous MSSQL Server c'est les crochets [...]
 
Ca doit venir de là.

Reply

Marsh Posté le 28-03-2003 à 23:35:53    

tu parle du - dans counter-ip ?


Message édité par Big-Foot le 28-03-2003 à 23:48:25
Reply

Marsh Posté le 28-03-2003 à 23:50:15    

Déja, il serait judicieux de tester le résultat de mysql_query :
 
$res = mysql_query("INSERT INTO counter-ip (ip, date) VALUES ($current_ip, NOW())" );
if (! $res) {echo "Erreur durant l'execution de la requete";}
 
Ca permettrait de vérifier si la requête s'exécute correctement ou pas [:proy]

Reply

Marsh Posté le 28-03-2003 à 23:57:14    

ben... il me fait une erreur
bon je vais verifier tout ca et je reposte demain, pask la je suis un peu fatigué....


Message édité par Big-Foot le 28-03-2003 à 23:59:56
Reply

Marsh Posté le 29-03-2003 à 12:13:52    

Big-Foot a écrit :

tu parle du - dans counter-ip ?


Oui, le "-" c'est l'opérateur "moins", et à partir de là, MySQL doit pas aimer des masses.
 
Donc il faut mettre le nom de la table dans entre caractères d'échappement pour lui indiquer qu'il s'agit d'un nom et non pas d'une expression.

Reply

Marsh Posté le 29-03-2003 à 13:55:30    

j'ai essayé avec un truc tout simple dans une table avec un nom sans "-" et ca marche. (donc tout ce ki est connnection a la bdd c'est bon)
 
Pour les caracteres d'echapement mysql, c'est le "\".
http://dev.nexen.net/docs/mysql/an [...] syntax.php
 
mais si je met "counter\-ip" ca marche toujour pas...
 
voila ce que j'ai essayé :
 

Code :
  1. <?php
  2. mysql_connect("localhost", "root", "" );
  3. mysql_select_db("bdd" );
  4. $res = mysql_query("INSERT INTO counter\-ip (ip, date) VALUES ('168.00.21.30', '2002-01-01 00:00:01')" );
  5. if (! $res) {echo "Erreur durant l'execution de la requete";}
  6. mysql_close();
  7. ?>

Reply

Marsh Posté le 29-03-2003 à 14:03:02    

'counter-ip' sous reserve ...
essaie dinserer ds phpmyadmin en utlisant longlet inserer, et utilise leur requete.

Reply

Marsh Posté le 29-03-2003 à 14:27:31    

j'avais deja essayer le 'counter-ip' sous reserve
mais merci je savais pas que phpmyadmin ecrivait les requettes aussi...
ben maintenent ca marche merci ! le probleme venait des ' ' je crois
 
ca donne ca :
 

Code :
  1. mysql_query("INSERT INTO `counter-ip` (`ip`, `date`) VALUES ('125.16.32.312', '2003-03-30 15:18:35')" );


 
mais je me pose quelques questions :
 
y a t'il une difference entre les ' '  et le ´ ´ ?
 
est ce que quand je met une variable dans les VALUES je doit toujour mettre les ' ' ?
 
merci


Message édité par Big-Foot le 29-03-2003 à 14:28:09
Reply

Marsh Posté le 29-03-2003 à 14:36:01    

Il faut encadrer avec ' ' les chaines de caractères et les dates, mais pas les entiers.
 
SELECT * FROM table WHERE txt = 'coucou' AND entier = 2
 
Dans les chaines de caractères, il faut protéger les ' par un \ ('aujourd\'hui';). Mais le plus simple est de systématiquement utiliser la fonction php addslashes quand tu gères des chaines de caractères :
$requete = "SELECT * FROM table WHERE txt = '" . addslashes($param_txt) . "' AND entier = " . $param_txt;

Reply

Marsh Posté le 29-03-2003 à 14:36:01   

Reply

Marsh Posté le 29-03-2003 à 15:08:25    

mrBebert a écrit :

Il faut encadrer avec ' ' les chaines de caractères et les dates, mais pas les entiers.
 
SELECT * FROM table WHERE txt = 'coucou' AND entier = 2
 
Dans les chaines de caractères, il faut protéger les ' par un \ ('aujourd\'hui';). Mais le plus simple est de systématiquement utiliser la fonction php addslashes quand tu gères des chaines de caractères :
$requete = "SELECT * FROM table WHERE txt = '" . addslashes($param_txt) . "' AND entier = " . $param_txt;
 


 
 
bigfoot > a oui ct ` et non pas '
 
tu peux entourer les entier par des '', ca evite les  id = $id or 1 meme si je le fais jamais  
sytematiquement addslashes, ok mais si magical_quotes est pas activé sinon ya redondance

Reply

Marsh Posté le 29-03-2003 à 18:08:04    

ok merci beaucoup
 
j'ai aussi remarqué que quand j'insere NOW() dans la table ca marche que si NOW() n'est pas entouré de '', c'est comme ca avec toute les fonction mysql j'imagine ? mais pour les fontion php ?

Reply

Marsh Posté le 29-03-2003 à 18:12:29    

Big-Foot a écrit :

ok merci beaucoupj'ai aussi remarqué que quand j'insere NOW() dans la table ca marche que si NOW() n'est pas entouré de '', c'est comme ca avec toute les fonction mysql j'imagine ? mais pour les fontion php ?

Effectivement, il faut mettre une date entre '' quand tu la précise explicitement. Pour NOW(), il faut pas.
Mais Ca n'a rien à voir avec les fonction PHP. Ta requête, c'est toujours une chaîne de caractères.
 
beleg > Ca marche comment magic_quotes :??:

Reply

Marsh Posté le 29-03-2003 à 20:15:05    

Active l'option "magic_quotes" pour les méthodes GPC (GET/POST/COOKIE) Lorsque les magic_quotes sont activées, les caractères ' (simple quote), " (double quote), \ (backslash) et NUL sont précédés automatiquement d'un backslash
 
donc si get_magic_quotes_gpc() pas besoin de addslashes avant insertion dans la base, c deja fait.
 
mais si tu veux afficher les données du formulaire, pour verification par exemple, si get_magic_quotes_gpc(), alors il faut faire un stripslahes avant laffichage sinon tu te retrouves avec des \ et plus tu valides plus ten as, jai decouvert ce probleme ds mes formulaires hier  :lol: ...  
 
donc demain verification de \ ' "  

Reply

Marsh Posté le 29-03-2003 à 20:46:22    

dans ce cas :  
 

Code :
  1. UPDATE table SET visits_cookies = visits_cookies+1, last_update = NOW(), name = test


 
qu'est ce que je doit mettree entre '' ou entre `` ?


Message édité par Big-Foot le 29-03-2003 à 20:46:41
Reply

Marsh Posté le 29-03-2003 à 20:55:15    

name, c'est du texte (char, varchar, text) ?
Si oui, faut mettre test entre ''


Message édité par mrbebert le 29-03-2003 à 20:56:02
Reply

Marsh Posté le 29-03-2003 à 20:58:48    

name j'ai inventé c'est juste pour savoir ce que je devrait faire quand ce n'est rien d'aurtre que du texte disons varchar...
mais pour le reste je laisse comme ca sans rien ?

Reply

Marsh Posté le 29-03-2003 à 21:01:39    

oui, y a besoin de rien d'autre :)

Reply

Marsh Posté le 29-03-2003 à 21:12:28    

oki  
mais regardez ici :

Code :
  1. mysql_query("UPDATE `counter-total` SET visits_ips = visits_ips+1, last_update = NOW() WHERE 'id = max(id)'" );


c'est juste ce que j'ai ecrit nan ?
pourtant il ne fait rien... ca devrait ajouter +1, mais ca fait rien meme pas une petit erreur et ma table reste comme avant

Reply

Marsh Posté le 29-03-2003 à 21:26:55    

Pourquoi le WHERE est entre '' :??:

Reply

Marsh Posté le 29-03-2003 à 21:29:15    

le id = max(id) ?

Reply

Marsh Posté le 29-03-2003 à 21:33:25    

oui :??:  
 
D'ailleurs, je crois pas que cette condition soit accepté par mysql :/

Reply

Marsh Posté le 29-03-2003 à 21:36:30    

je croi que j'ai vu kek part qu'elle est accepté...  
mais si je met pas les ' ' il me fait une erreur

Reply

Marsh Posté le 29-03-2003 à 21:40:31    

la par exemple (en bas)  
http://www.php.net/manual/fr/function.max.php
il y a kek'un qui utilise max()avec mysql


Message édité par Big-Foot le 29-03-2003 à 21:40:41
Reply

Marsh Posté le 29-03-2003 à 21:56:31    

Pourquoi tu mets une fonction PHP dans une requête :??:  
mysql fait du SQL, pas du PHP :non:  
 
Et la fonction max() de SQL, elle s'utilise pas de cette manière. Tu veux faire quoi comme requête ?

Reply

Marsh Posté le 29-03-2003 à 21:59:40    

ben moi je voulai selectionner la derniere ligne de la table... autrement dit le dernier id

Reply

Marsh Posté le 29-03-2003 à 22:06:05    

T'es obligé de faire 2 requêtes :
- 1 qui récupère le dernier id (SELECT max(id) FROM `counter-total`)
- 1 autre qui fait le update (UPDATE ... SET ... WHERE id = la_valeur_recupere_par_mla_requete_precedente)
 
A moins que tu n'ais une version suffisamment récente de mysql pour faire ca :
UPDATE ...
SET ...
ORDER BY id DESC
LIMIT 0, 1

Reply

Marsh Posté le 29-03-2003 à 22:10:03    

alors le max(id) je peu l'utliser dans un SELECT mais pas dans un WHERE ??
 
et pour la 2eme methode tu peu preciser un peu stp (ou une url) merci

Reply

Marsh Posté le 29-03-2003 à 22:15:08    

Oui, le max() fait partie des fonctions d'aggrégation. C'est à dire des fonction qui portent sur plusieurs lignes, en les regroupant.
Par exemple, en écrivant "SELECT max(id) from table", ca te renvoie une seule ligne, contenant la valeur maximale de id.
Toutes les lignes du résultat sont regroupées en une seule.
 
Parmi ces fonctions, tu as aussi :
- count(*) qui renvoie le nombre de lignes
- sum(champ) qui additionne les champs
- avg (la moyenne) ....  
 
Elles sont souvent utilisées avec le GROUP BY, qui permet d'avoir plusieurs groupes de lignes.
 
 
Pour la 2ème méthode, au lieu de modifier la ligne ayant le plus grand id, je demande à modifier les lignes dans l'ordre décroissant de l'id, et en s'arrêtant dès qu'une a été modifiée :)  
Pour faire du SQL, souvent, faut être bon en français et savoir reformuler différemment ce que tu veux faire :D


Message édité par mrbebert le 29-03-2003 à 22:19:06
Reply

Marsh Posté le 29-03-2003 à 22:19:10    

:D  
mais pour le max(id) il n'y aura qu'un seul resultat alors ou est le probleme ?


Message édité par Big-Foot le 29-03-2003 à 22:20:22
Reply

Marsh Posté le 29-03-2003 à 22:23:30    

oui, mais le max se fait dans le select, pas dans le WHERE.
 
Le serveur SQL détermine d'abord quelles lignes respectent le WHERE, puis ensuite calcule le max() (ou le count(), sum() ...) sur ces lignes.
Mais il peut pas calculer le max() tant qu'il a pas fini avec les WHERE.
 
Si tu avais les requêtes imbriquées, ca pourrait s'écrire sous la forme :
SELECT ... FROM ... WHERE id = (SELECT max(id) FROM table)


Message édité par mrbebert le 29-03-2003 à 22:24:34
Reply

Marsh Posté le 29-03-2003 à 22:27:02    

ah... ok  
alors je vais utiliser ton autre truc :  
UPDATE ...  
SET ...  
ORDER BY id DESC  
LIMIT 0, 1

Reply

Marsh Posté le 29-03-2003 à 22:36:59    

c'est juste comme ca ?

Code :
  1. mysql_query("UPDATE `counter-total` SET visits_ips = visits_ips+1, last_update = NOW() ORDER BY `id` DESC LIMIT 0, 1" );


pask ca marche pas... il y a un probleme avec la fin, a partir de ORDER BY...
 
et puis j'ai pas tres bien compris le LIMIT 0, 1


Message édité par Big-Foot le 29-03-2003 à 23:34:49
Reply

Marsh Posté le 30-03-2003 à 00:25:28    

Ca doit dépendre de ta version de mysql, c'est une syntaxe assez "récente" [:proy]  
 
Le LIMIT permet de se limiter à certaines lignes du résultat. C'est très pratique pour certaines requête où tu n'as besoin que de certaines lignes du résultat, et pas toutes. Par exemple, si tu as beaucoup de données et que tu veux une consultation page par page.
Le premier paramètre du LIMIT est la ligne de départ, le deuxième le nombre de lignes à prendre.
 
Par exemple, sur ce forum, tu n'as pas la liste de tous les topics d'une catégorie, mais seulement, disons, 20 par page. avec un paramètre dans l'URL pour le numéro de page.
On pourrait imaginer que dans la requête, il y ait
"... LIMIT 0, 20" pour la première page, "... LIMIT 20, 20" pour la deuxième, "... LIMIT 40, 20" pour la troisième

Reply

Marsh Posté le 30-03-2003 à 01:07:30    

ok, mais pour definir la limite "fin", si on veut afficher tout le tableau, on peut seulement mettre un grand chiffre ou bien auparavant faire une requette SELECT max(id) ce qui sera identique a la premiere technique nan (celle ou on selectione le max dans 1 requette puis dans 1 autre on le modifie) ?

Reply

Marsh Posté le 30-03-2003 à 01:22:42    

Effectivement, il y a un problème si on ne sait pas à l'avance combien il y a d'éléments en tout [:proy]  
Le plus simple est de passer une fois la requête en faisant un count(*) pour savoir combien d'éléments sont concernés, puis la requête elle même avec les limites que l'on veut. Mais ca oblige à exécuter 2 fois la requête :/

Reply

Marsh Posté le 30-03-2003 à 01:28:34    

arf ben faudra s'en contenter jusqu'a la prochaine version  :)  
a par ca, moi j'utilise easyPHP, mais la derniere version (1.6) n'a pas la derniere vesion de mysql... j'ai downloader mysql, mais est ce que je peu le mettre dans et surtout dans quel dossiers est ce que je peu le mettre pour que ca fonctionne ?

Reply

Marsh Posté le 30-03-2003 à 01:36:58    

euh.... non en fait j'ai telechargé phpmyadmin new version...  :D  
mais est ce que je peu updater la version mysql de easaPHP ?

Reply

Marsh Posté le 30-03-2003 à 15:24:59    

je crois que j'ai reussi  :bounce:  
 
j'ai copier les dossiers de mysql (new version) et phpmyadmin (new version) dans EasyPHP, et ca marche je crois


Message édité par Big-Foot le 30-03-2003 à 15:38:55
Reply

Marsh Posté le 30-03-2003 à 15:58:07    

ben ca marche toujours pas :

Code :
  1. mysql_query("UPDATE `counter-total` SET visits_ips = visits_ips+1, last_update = NOW() ORDER BY `id` DESC LIMIT 0, 1" );


 
je sais pas pourquoi, pourtant j'ai la derniere version mysql...
 :cry:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed