Avatar billede bahn Nybegynder
10. september 2015 - 21:23 Der er 13 kommentarer og
1 løsning

mysql_query laves om til pdo statement

$search = explode(" ", $search_post);
$numrows = sizeof($search);


// udtræk fra pernons
$query = "SELECT persons.id FROM persons WHERE 1 AND deleted =0";

foreach ($search as $value)
{
    $query .= " AND (firstname LIKE '%".$value."%'";
    $query .= " or surname LIKE '%".$value."%'";
    $query .= " or nickname LIKE '%".$value."%'";
    if (is_int($value*1)) $query .= " or persons.id = '$value'";
    $query .= ")";
}
    $query .= " GROUP BY persons.id ORDER BY firstname asc LIMIT 0,10";

    $data = mysql_query($query);
    $numrows = mysql_num_rows($data);


/////////

jeg mangler en god løsning til at lave dette om til en PDO
nogle ideer?
Avatar billede arne_v Ekspert
11. september 2015 - 03:00 #1
Samme loekke, men du goer to tingen inden i den:
1) opbygger en SQL streng med placeholders som skal prepares
2) opbygger et array med vaerdierme soms kal executes senere
og saa preparer du og executer
Avatar billede bahn Nybegynder
11. september 2015 - 07:51 #2
Arne_v: får jeg så samme resultet
jeg søger ex på "Pet han mek"
vel jeg gerne finde
Firstname Peter
Surname Hansen
Nickname Mekanikeren

og kun de resultater hvor alle 3 bider er med.

jeg kan ikke helt se det for mig med dit forslag
Avatar billede arne_v Ekspert
11. september 2015 - 17:19 #3
Nu er jeg lidt forvirret over hvad du soeger.

Der er to helt uafhaengige problemer:

1) hvordan query skal strikkes sammen med AND eller OR for at faa det resultat du oensker

2) hvordan du konstruerer en PDO prepared statement med et variabelt antal betingelser

Mit svar var til problem #2.
Avatar billede bahn Nybegynder
11. september 2015 - 17:50 #4
som beskrevet i mit spørgsmål

har jeg begge problemer på en gang og det kan jeg ikke finde ud af
Avatar billede arne_v Ekspert
12. september 2015 - 03:57 #5
I dit spoergsmaal skrev du at du behoevede hjaelp til at "lave dette om til en PDO".

Jeg formodede at det betoed at den SQL der var i eksemplet faktisk virkede som du oenskede.
Avatar billede bahn Nybegynder
12. september 2015 - 07:34 #6
ja sql'en virker fint nok.
jeg kan bare ikke se hvor jeg preparer og binder et array så det kommer til at virke på samme måde
Avatar billede arne_v Ekspert
13. september 2015 - 00:00 #7
Og det var det som jeg svarede paa i #1
Avatar billede bahn Nybegynder
13. september 2015 - 13:52 #8
jeg kan ikke finde ud at at omsætte det du skriver til praksis.
jeg forstår det ikke.
Kan du komme med et eksempel?
Avatar billede arne_v Ekspert
13. september 2015 - 14:44 #9
Det maa blive noget a la (utestet):

$query = "SELECT persons.id FROM persons WHERE 1 AND deleted = 0";
$pvalues = array();
$pnr = 0;
foreach ($search as $value)
{
    $pnr++;
    $valueplace = 'p' . $pnr;
    $query .= " AND (firstname LIKE '%".$valueplace."%'";
    $query .= " or surname LIKE '%".$valueplace."%'";
    $query .= " or nickname LIKE '%".$valueplace."%'";
    if (is_int($value*1)) $query .= " or persons.id = '$valueplace'";
    $query .= ")";
    $pvalues[$valueplace] = $value;
}
query .= " GROUP BY persons.id ORDER BY firstname asc LIMIT 0,10";
$stmt = $con->prepare($query);
$stmt->execute($pvalues);
Avatar billede arne_v Ekspert
13. september 2015 - 14:45 #10
ups

$valueplace = 'p' . $pnr;

skal naturligvis vaere

$valueplace = ':p' . $pnr;
Avatar billede arne_v Ekspert
13. september 2015 - 15:53 #11
'' skal ogsaa vaek omkring parametre.

Og % skal ind i parametre.
Avatar billede arne_v Ekspert
13. september 2015 - 19:02 #12
Kombineret:

$query = "SELECT persons.id FROM persons WHERE 1 AND deleted = 0";
$pvalues = array();
$pnr = 0;
foreach ($search as $value)
{
    $pnr++;
    $valueplace = ':p' . $pnr;
    $wcvalueplace = ':wcp' . $pnr;
    $query .= " AND (firstname LIKE $wcvalueplace";
    $query .= " or surname LIKE $wcvalueplace";
    $query .= " or nickname LIKE $wcvalueplace";
    if (is_int($value*1)) $query .= " or persons.id = $valueplace";
    $query .= ")";
    $pvalues[$valueplace] = $value;
    $pvalues[$wcvalueplace] = '%' . $value . '%';
}
query .= " GROUP BY persons.id ORDER BY firstname asc LIMIT 0,10";
$stmt = $con->prepare($query);
$stmt->execute($pvalues);
Avatar billede bahn Nybegynder
23. oktober 2015 - 10:42 #13
Super det er en skide god løsning
smid et svar
Avatar billede arne_v Ekspert
23. oktober 2015 - 14:19 #14
svar
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

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