[RESOLU] SQlite Moi aussi j'ai un soucis

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[RESOLU] SQlite Moi aussi j'ai un soucis

Message par Ar-S »

Salut,
Comme SQLite a le vent en poupe dans certains topic, j'ai tenté de m'y mettre.
J'ai cependant un soucis pour récupérer une simple ligne.

Résumer :
Une base #MABASE
Une table contacts
4 colonnes : id,prenom,nom,email

Monsoucis vient de ma fonction AfficheInfo(base, prenom$)
qui ne me renvoit rien alors qu'elle devrait renvoyer : 1 Cyrille LDV arsworld[arob]gmail[point]com si je clic sur Cyrille LDV dans le combo ce qui lance un

Code : Tout sélectionner

AfficheInfo(#MaBase, "Cyrille") 
Voilà le code

Code : Tout sélectionner

UseSQLiteDatabase()

Enumeration 
    #WIN
    #MaBase
    #Fichier
    #Liste
    #Info
EndEnumeration

Global Filename$ = GetCurrentDirectory()+"test01.sqlite"

Declare LectureBDD(BaseID)
Declare Insere(Base, prenom$, nom$, email$)
Declare Delete(Base, prenom$, nom$)
Declare.s AfficheInfo(Base, Prenom$)


; PROCEDURE Pour les gens ne connaissant pas les requêtes SQL
Procedure Insere(Base, prenom$, nom$, email$)
    Result = DatabaseUpdate(Base, "INSERT INTO contacts (nom, prenom, email) VALUES ('"+prenom$+"','"+nom$+"','"+email$+"')" )
    If Result = 0
        Debug DatabaseError()
    
    EndIf
    ProcedureReturn Result
EndProcedure


Procedure Delete(Base, prenom$, nom$)
    Result = DatabaseUpdate(Base, "DELETE (nom, prenom) From contacts WHERE prenom = "+prenom$+ "AND nom="+nom$ )
    If Result = 0
        Debug DatabaseError()
    EndIf
    ProcedureReturn Result
EndProcedure

Procedure.s AfficheInfo(base, prenom$)
    Requete$ = "SELECT * FROM contacts WHERE prenom ='"+prenom$+"' LIMIT 1"
    If DatabaseQuery(Base, Requete$) 
        While NextDatabaseRow(base) ; Enumeration des enregistrements
            If GetDatabaseString(Base, 1) = Prenom$
                Debug "Trouvé !"
                match$ = GetDatabaseString(Base, 0) + " " + GetDatabaseString(Base, 1) + " " + GetDatabaseString(Base, 2)+ " " + GetDatabaseString(Base, 3)
            EndIf
        Wend
        FinishDatabaseQuery(base)
    Else
       match$ = DatabaseError()
    EndIf
    ProcedureReturn match$
EndProcedure


Procedure LectureBDD(BaseID)
; On Ouvre la Base
If OpenDatabase(#MaBase, Filename$, "", "")
    Debug "Connecté à PureBasic.sqlite"

    ; Si la base existe déjà, on lit les infos des contacts
    If DatabaseQuery(#MaBase, "SELECT * FROM contacts ORDER BY prenom DESC") ; Recupère tous les enregistrements de la table 'contacts' par ordre alphabétique de prénoms
        
        While NextDatabaseRow(#MaBase)
            Debug GetDatabaseString(#MaBase, 0) + " " + GetDatabaseString(#MaBase, 1) + " " + GetDatabaseString(#MaBase, 2)+ " " + GetDatabaseString(#MaBase, 3)
            AddGadgetItem(#Liste, -1, GetDatabaseString(#MaBase, 1) + " " + GetDatabaseString(#MaBase, 2))
        Wend
        Debug "Fermeture de la requête"
        FinishDatabaseQuery(#MaBase)
        
        ; Insertion d'un autre utilisateur
       ; Insere(#MaBase, "John", "Doe")

        
    Else
        ;"On va créer une base contacts avec 2 contacts"
        ; La requête suivante va créer une table "contacts" avec les colonnes nom, prenom et email. Le champ email ne pourra pas être dupliqué)
        
         Requete$ = "CREATE TABLE contacts (id INTEGER PRIMARY KEY, nom VARCHAR(50) Not NULL, prenom VARCHAR(50) Not NULL, email VARCHAR(100) Not NULL UNIQUE);"
         If DatabaseUpdate(#MaBase, Requete$)
             Debug "Table créée"
             Insere(#MaBase, "Cyrille", "LDV","arsworld@gmail.com" )
             Insere(#MaBase, "Bob", "Marley","rastafari@threelittlebirds.com")
             Debug "données insérées, affichage dans le comboBox"
         EndIf
         
         ; Maintenant que les infos sont insérées, on les lit et les affiche
         If DatabaseQuery(#MaBase, "SELECT * FROM contacts") ; Recupère tous les enregistrements de la table 'contacts'
             While NextDatabaseRow(#MaBase)
                 Debug GetDatabaseString(#MaBase, 0) + " " + GetDatabaseString(#MaBase, 1) + " " + GetDatabaseString(#MaBase, 2)+ " " + GetDatabaseString(#MaBase, 3)
                 AddGadgetItem(#Liste, -1, GetDatabaseString(#MaBase, 1) + " " + GetDatabaseString(#MaBase, 2))
             Wend
             Debug "Fermeture de la requête"
             FinishDatabaseQuery(#MaBase)
         EndIf
         
    EndIf
    
   
EndIf
EndProcedure


; =========== PROGRAMME ==========


;Création du fichier qui contiendra la base.
If OpenFile(#Fichier, Filename$,#PB_File_SharedWrite)
    Debug "Fichier de base de données créé"
    CloseFile(#Fichier)
Else
    Debug "Impossible de créer la base"
    End
EndIf



 If OpenWindow(#WIN, 0, 0, 270, 180, "SQLIte Demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ComboBoxGadget(#Liste, 10, 10, 250, 21, #PB_ComboBox_Editable)
    LectureBDD(#MaBase)
    SetGadgetState(#Liste, 0)
    
    StringGadget(#info,2,WindowHeight(#win)-22,WindowWidth(#win)-4,20,"info",#PB_String3D_ReadOnly)
    SetGadgetColor(#Info,#PB_Gadget_BackColor,$0) : SetGadgetColor(#Info,#PB_Gadget_FrontColor,#White)
    
    Repeat
        Event = WaitWindowEvent()
        
        Select Event
                
            Case #PB_Event_Gadget
                Select EventGadget()
                    Case #Liste
                        
                        Prenom$ = StringField(GetGadgetItemText(#Liste, GetGadgetState(#liste)),1," ")
                        Debug "Lancement de la recherche pour : " + Prenom$
                        SetGadgetText(#Info, AfficheInfo(#MaBase, Prenom$) )
                EndSelect
                
        EndSelect
  
    Until event = #PB_Event_CloseWindow
EndIf

 CloseDatabase(#MaBase) 
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: SQlite Moi aussi j'ai un soucis

Message par Ollivier »

C'est normal. "Cyrille" est une donnée personnelle donc, non ça ne marchera pas !

Tout d'abord (avant que des poids lourds du SQ light te répondent !), petite remarque de sécurité.

On ne peut pas empêcher une pénétration non consentie dans une base de données. Mais on peut diminuer les chances de voir sa/ses base(s) de données perdre sa/leur vertu. Ça peut être 10, 100, 1000 fois plus sécurisé, voire plus.

La petite note qu'il est bon de conseiller : ne jamais utiliser de chaînes directes :

Code : Tout sélectionner

Define.s ceci = "C'est pas bien"
Une bonne école pour la sécurité : l'open source. En effet, quand on part du principe qu'un source va être lu publiquement, on est beaucoup plus pointilleux sur la méthode de sécurisation. Une méthode de sécurisation : la machine virtuelle. On collecte un ensemble de fonctions que l'on programme. Puis, on charge un programme (ensemble de byte codes propres à cette machine virtuelle), puis on l'exécute. Tout est open source, mais, rien ou peu n'est vu par quiconque se fait clandestin pénétrant.

Et si le CCCP (Cas Craignos de Clandestin Pénétrant) accède et consulte à cette machine virtuelle, on peut mathématiquement dynamiser la map opératoire de la machine virtuelle.

Techniquement, ça demande un certain savoir-faire de la machine virtuelle, car une map opératoire dynamique est facilement instable. Mais une fois bien huilée, plus aucun humain n'a accès au code virtuel, bien que le code réel soit open source. Le cryptage fonctionnel devient alors affaire de puissance de machine pour voiler/dévoiler le système virtuel.

Ce qui m'interloque, et là, je fais l'opportuniste, car j'apprécierai une réponse de chevronnés du SQ light, c'est ceci :

SQ light est une sorte de machine virtuelle fonctionnant par string-codes concaténés dans un support de chaînes à nul terminal. Pourquoi aucune clef n'est fournie à chaque requête pour crypter la requête suivante ?

En vous remerciant par avance, après avoir aidé ArS, bien évidemment !


@ArS

(Hors sujet moins hors sujet, et après avoir grave galéré juste pour copier une simple ligne de ton code !) Dans ta procédure Delete :

Code : Tout sélectionner

Result = DatabaseUpdate(Base, "DELETE (nom, prenom) From contacts WHERE prenom = "+prenom$+ "AND nom="+nom$ )
La syntaxe ça ne serait pas ça :

Code : Tout sélectionner

Result = DatabaseUpdate(Base, "DELETE (nom, prenom) From contacts WHERE prenom = '"+prenom$+ "' AND nom='"+nom$ +"'" )
?

(et dans le sujet...) Dans ta procédure Insere, il semble y avoir présence d'un grelot dans la rillette :

Code : Tout sélectionner

Result = DatabaseUpdate(Base, "INSERT INTO contacts (nom, prenom, email) VALUES ('"+prenom$+"','"+nom$+"','"+email$+"')" )
Tu as interverti "nom" et "prénom". Look l'ordre d'en-tête N.P.E. et l'ordre des données : P.N.E. .
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: SQlite Moi aussi j'ai un soucis

Message par Ar-S »

Merci Ollivier.
"Cyrille" est une donnée personnelle donc, non ça ne marchera pas !
Si, normalement "Cyrille" est la donnée présente dans la colonne "prenom" de la table en tant que VARCHAR.

Pour la sécurité en (my)SQL je gère. là c'est vraiment un apprentissage en douceur de SQLite via PB.
Bien joué pour l'inversion des nom/prenom, surement en cause. Je vais tester.
Pour la proce delete effectivement j'aurai pas du la poster de suite je ne l'ai pas encore testé mais le ' sont évidement à ajouter.

Je vous tiens au jus.

---edit---

ça ne marchait pas à cause de l'inversion nom/prenom.. Mais quel boulet !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU] SQlite Moi aussi j'ai un soucis

Message par Marc56 »

PS. DELETE supprimant tout un enregistrement (= la ligne) on ne précise pas les noms de colonnes.

Code : Tout sélectionner

; Non
DELETE (nom, prenom) From ...
; Oui
DELETE From ...
Pour ne pas perdre du temps à debbuger PB et le SQL, teste tes requêtes hors PB
https://sqlite.org/download.html
Lien direct version Windows sqlite-tools-win32-x86-3380500.zip (1.87 MiB) (SQLite3.exe à copier là où tu en as besoin)
:wink:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [RESOLU] SQlite Moi aussi j'ai un soucis

Message par Ollivier »

ArS a écrit :ça ne marchait pas à cause de l'inversion nom/prenom.. Mais quel boulet !
Oui, c'est peut-être pour ça que j'ai noyé ma suggestion sous une grosse pavasse : vu que je n'ai pas souvenir d'avoir exécuté une seule fois de ma vie ce "piètre système de base de données", ça faisait un peu contradictoire qu'étant un gros grelot dans le sujet, j'apporte comme cela une réponse si cinglante de réalisme.

@marc56Regarde l'heure de mon message : j'ai profité de ton sommeil. Je suis immonde !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [RESOLU] SQlite Moi aussi j'ai un soucis

Message par Ar-S »

Salut Marc.
J'ai bien récupe l'exe, je le lance et j'ouvre ma base mais après ? Je ne vois pas trop comment tester une fonction.
Par exemple, je lance "SELECT * FROM contacts ORDER BY prenom ASC"
Rien ne s'affiche..

note: Je m'en sort bien. J'ai refait mon code pour choper un contact d'aprés l'ID ce qui est plus logique. J'ai ajouté une liste chainée pour enregistrer mes contacts et ainsi repérer le bon ID lorsqu'on clique sur le combo.
Je posterai tout ça quand ce sera plus propre et je virerai ce topic après.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU] SQlite Moi aussi j'ai un soucis

Message par Marc56 »

Si je fais avec ton programme, j'ai bien tout:

Code : Tout sélectionner

C:\>sqlite3.exe test01.sqlite
SQLite version 3.38.5 2022-05-06 15:25:27
Enter ".help" for usage hints.
sqlite> .d
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE contacts (id INTEGER PRIMARY KEY, nom VARCHAR(50) Not NULL, prenom VARCHAR(50) Not NULL, email VARCHAR(100) Not NULL UNIQUE);
INSERT INTO contacts VALUES(1,'Cyrille','LDV','arsworld@gmail.com');
INSERT INTO contacts VALUES(2,'Bob','Marley','rastafari@threelittlebirds.com');
COMMIT;


sqlite> .mode table
sqlite> SELECT * FROM contacts ORDER BY prenom ASC;
+----+---------+--------+--------------------------------+
| id |   nom   | prenom |             email              |
+----+---------+--------+--------------------------------+
| 1  | Cyrille | LDV    | arsworld@gmail.com             |
| 2  | Bob     | Marley | rastafari@threelittlebirds.com |
+----+---------+--------+--------------------------------+
sqlite>
C'est là que tu vois que tu as entré les prénoms dans le champs nom.

.q = quit
.d raccourci pour la commande 'dump' = fichier de sauvegarde de la base
.help pour l'aide
etc.
Dernière modification par Marc56 le lun. 23/mai/2022 20:28, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [RESOLU] SQlite Moi aussi j'ai un soucis

Message par Ar-S »

Super. Il me manquait le .d de départ.. (quelle drôle d'idée)
En tout cas j'avance bien.
J'ai ajouté l'ajout de contact et la suppression.
Tout roule.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU] SQlite Moi aussi j'ai un soucis

Message par Marc56 »

Le .d est juste pour afficher qu'on a bien tout saisi ici (et qu'on est sur la bonne table)
Tu peux taper directement la requête.
En passant l'affichage en mode table (.mode table), on a le titre des champs et un alignement.

Code : Tout sélectionner

sqlite> .mode table
sqlite> SELECT * FROM contacts ORDER BY prenom ASC;
+----+---------+--------+--------------------------------+
| id |   nom   | prenom |             email              |
+----+---------+--------+--------------------------------+
| 1  | Cyrille | LDV    | arsworld@gmail.com             |
| 2  | Bob     | Marley | rastafari@threelittlebirds.com |
+----+---------+--------+--------------------------------+
Le mode liste .mode list (affichage par défaut) sert à exporter en CSV avec | comme séparateur.
:wink:
Répondre