Avatar billede gyldmark Nybegynder
11. august 2014 - 13:56 Der er 5 kommentarer og
1 løsning

PHP PDO BindValue med samme variabel flere steder i SELECT

Hej, jeg er ny i PDO og har nu kastet mig ud i konvertering af mit mest avanceret PHP-script: søgemaskinen. Nedenstående afsnit virker, men er der ikke en enklere metode at afvikle bindValue på, når det nu er samme variabel, som optræder flere steder i SELECT?

$foresp = $database->prepare("SELECT * FROM tabel WHERE fdatosort LIKE ? OR ddatosort LIKE ? OR fdato LIKE ? OR ddato LIKE ?");
$foresp->bindValue(1, "%$find%", PDO::PARAM_STR);
$foresp->bindValue(2, "%$find%", PDO::PARAM_STR);
$foresp->bindValue(3, "%$find%", PDO::PARAM_STR);
$foresp->bindValue(4, "%$find%", PDO::PARAM_STR);

Har forsøgt med én enkelt navngivning: ':find' i stedet for ? og fortløbende numre. Kan man bruge noget foreach og/eller bindParam - Har nogen et godt bud på en løsning her?

Mange hilsner
Henrik
Avatar billede Slettet bruger
11. august 2014 - 14:14 #1
Når du binder en variable skal du bruge bindParam, jeg ville skrive det noget lign dette:

$find = '%' . $find . '%';

$foresp = $database->prepare("SELECT * FROM tabel WHERE fdatosort LIKE :fdatosort OR ddatosort LIKE :ddatosort OR fdato LIKE :fdato OR ddato LIKE :ddato");
$foresp->bindParam(':fdatosort', $find, PDO::PARAM_STR);
$foresp->bindParam(':ddatosort', $find, PDO::PARAM_STR);
$foresp->bindParam(':fdato', $find, PDO::PARAM_STR);
$foresp->bindParam(':ddato', $find, PDO::PARAM_STR);
Avatar billede Slettet bruger
11. august 2014 - 14:17 #2
Et lille edit: Man "skal" selvfølgelig ikke nødvendigvis bruge bindParam :)
Avatar billede gyldmark Nybegynder
11. august 2014 - 14:38 #3
OK - så man skal have en 'bind' linie for hver forekomst i SQL selvom værdien er den samme?
Avatar billede Slettet bruger
11. august 2014 - 14:45 #4
Jeg mener faktisk godt at man kan bruge værdien flere gang, altså så du kun har én bindParam, hvilket som du selv siger også giver mest mening da det er den samme værdi, jeg tænkte ikke så meget over det, jeg skrev blot en hurtig lille løsning udfra den eksisterende kode :)
Avatar billede Slettet bruger
12. august 2014 - 09:51 #5
Har du fået det til at virke?
Avatar billede gyldmark Nybegynder
12. august 2014 - 17:47 #6
Ja, det virker fint med de 4 nævnte bindValue linier.

Jeg har som nævnt ledt efter en enklere løsning med færre antal bind linier, evt. i et foreach loop, det kunne jeg dog kun finde i et eksempel med et array indeholdende forskellige værdier og så én bindParam i et foreach loop.

Kan dog ikke finde noget på, hvis samme variabel skal testes flere steder i samme SQL. Jeg har nemlig også en mere avanceret SQL med flere gentagne værdier, her har jeg så foreløbig begrænset mig til kun at binde de variabler, der er det reelle brugerinput fra HTML-formularen i søgemaskinen og ikke de variabler til SQL'en som jeg selv genererer i scriptet.

Tak for det alternative script - du få pointene :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester