MySQL Driver [ Nenad Rakocevic / SOFTINNOV ]
akira14-Dec-2006/6:38:30+1:00
Hello

En essayant de suivre la documentation fournie je tente de classer automatiquement mes rows après une requete sur la base de données mysql :

Aussi j'aurais 2 questions de débutant ( qui galère mais qui s'accroche )
:
# Comment passer une variable pour remplacer le nom de la table en dur ?

# Comment tout récupérer [trié] dans une variable tableau ?

Moi j'en suis là :
sort foreach row read join mysql://root@localhost/mabase? "select * from " matable [print row]


a+
akira14-Dec-2006/6:56:07+1:00
Je viens juste de penser à GROUP BY de mysql

Si ca se trouve ca peut marcher comme cela. ?
Philippe14-Dec-2006/7:03:51+1:00
Salut,

Pense à lire la doc, cela évite de perdre du temps

1/ Tu y as des exemples :
http://softinnov.org/rebol/mysql-usage.html#sect6.2.

tables: [books movies cds games tmp]
foreach table tables [
    insert db ["Delete from ?" table]
]


2/ pour le classement, peut-être le faire déjà au niveau de ta requête SQL avec un " order by " ? (me rappelle plus si MySQL tolère cette syntaxe, je suis plutôt Oracle en ce moment).

===Philippe
akira14-Dec-2006/7:16+1:00


J'ai trouvé pour le tri il fallait bien le faire faire par mysql => c'est plus simple compte tenu de mon niveau actuel

Mai j'ai pas résolu mon problème de variables dans la requête ...

A +

resultat: foreach row read join mysql://root@localhost/mabase? "select * from table order by id" [print row]
akira14-Dec-2006/7:23:23+1:00
Philippe on a posté quasi en même temps

Merci pour ton aide
akira14-Dec-2006/8:10:31+1:00
Bon je cale... Je ne sais pas comment assigner une variable dans le coeur de la requete en 1 ligne.

J'ai essayé plein de combinaisons ca ne passe pas.
J'abandonne ( nuit blanche info => dodo maintenant )

En espèrerant que cet après midi j'aurais les idées claires je passerai sur le forum en première chose.

a+
coccinelle14-Dec-2006/12:06:07+1:00
Pour ta dernière question, voici une solution :
sort foreach row read rejoin [ mysql://root@localhost/mabase? "select * from " matable][print row]
Mais c'est une solution risquée (sql attack). Mieux vaut faire ainsi:
db: open mysql://root@localhost/mabase
insert db ["select * from ?" matable]
foreach row copy db [print row]
close db
Goldevil14-Dec-2006/16:55+1:00
Il est plus performant de fair le tri avec MySQL (order by) que le faire dans rebol.

Quand tu as un query un peu compliqué à construire, tu peux simplement construire un string avec le query et après l'injecter à MySQL.

myquery: rejoin [ "select * from " matable " where " moncritere " order by " montri]

insert db reduce [ myquery ]
...

coccinelle14-Dec-2006/20:13:51+1:00
Faites attention au construction des requêtes avec join ou rejoin, vous courrez le risque d'intrusion SQL (SQL Intrusion).

Par exemple, si l’utilisateur saisi dans un champs password la valeur :
 ' or '' = '
et que le code fait un
 rejoin [{select * from user where pseudo='} pseudo {' and pass='} pass {'}] 
le résulat obtenu est
 select * from user where pseudo='nickname' and pass='' or '' = '' 

Ce résultat est une requête qui va aboutir même si l’utilisateur ne connait pas le mot de passe.

Si vous êtes sensibles au problème, vous trouverez une foultitude d'information sur le net en faisant une recherche sur SQL Intrusion dans votre moteur de recherche préféré.

Ce genre de problème est résolu en utilisant des requêtes avec remplacement de paramètres. Exemple :
insert db [{SELECT * FROM user WHERE pseudo = ? AND pass = ?} pseudo pass] 
Le protocole MySQL traite correctement ce genre de requêtes sans risque d’attaque par SQL Injection.
akira15-Dec-2006/2:13:17+1:00


Youpiiiii ca fonctionne

Tant pis pour SQL intrusion. Mon appli fonctionnera en local uniquement.

Grace à vos conseils j'en suis venu à bout
Merci à tous ...

myquery: rejoin
[
  "select id from table where nom='" nom
]
resultat: read join mysql://root@localhost/db? myquery 
akira15-Dec-2006/2:16:56+1:00
Et mince rectification :

myquery: rejoin
[
  "select id from table where nom='" nom "'"
]
resultat: read join mysql://root@localhost/db? myquery


C'est mieux comme ca
akira15-Dec-2006/2:52:14+1:00


Je sais pas comment lui dire si resultat est vide alors print vide si resultat different vide alors print ok

PHP

if ( $resultat != "" )
{
  echo "ok";
  // traitement
} else echo "ERREUR";


Je cherche encore ...
akira15-Dec-2006/3:11:02+1:00
Avec rebol dans la requete sql 1 line ( j'adore )
Meme si la requete renvoie du vide elle revoie une chaine PAS VIDE

Quand je fais ceci juste après la requete volontairement faussée

print head? résultat


Benh j'ai le droit à un joli TRUE
coccinelle15-Dec-2006/7:37:07+1:00
Tu devrais regarder l'aide de head?, tape help head? dans la console.

En fait, ce n'est pas la bonne instruction, utilise head sans le ? et tu devrais avoir quelque chose de meilleur.
coccinelle15-Dec-2006/7:54:18+1:00
En jetant un cou d'oeil sur le protocol de nenad, je me dis que tu dois pouvoir faire ceci pour utiliser le read tout en évitant les intrusions :
myquery: [
  "select id from table where nom=?" nom
]
resultat: read join mysql://root@localhost/db? remold myquery
either empty? resultat [
    print "Resultat vide"
][
    print resultat
]
et si tu veux le tout en une seul ligne :
either empty? resultat: read join mysql://root@localhost/db? remold [
    "select id from table where nom=?" nom
][
    print "Resultat vide"
][
    print resultat
]
akira15-Dec-2006/15:51+1:00
Oki c bon ca fonctionne nickel.

Merci a tous de votre aide.

J'en ai profité pour renommer EITHER par ifNot
Juste pour essayer

ifNot: :either



Maintenant j'ai besoin de vous pour PARSE mais j'ouvre un autre trhead

a+

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2