TulorkMedlem sedan aug. 2004903 inlägg Jag har fälten id och money med rätt värde och allt, båda INT. Skickar jag bara in 1 fråga i funktionen dbSelect() så returnerar den korrekt resultat. Men om jag skickar in 2 så returnerar funktionen en tom array.
Kan man inte använda bindParam() i en foreach på detta sätt?
Fråga 2... för att optimera koden ännu mer vill man ju helst slippa bindParam foreach-satsen helt och istället köra bindParam i den första foreach-satsen. Möjligt ?
<?php
function dbSelect($table, $query) {
require_once ("../db/connect.php");
foreach($query as $id => $value) {
$dbQuery .= $id." = :".$id.' AND ';
}
$dbQuery = substr($dbQuery, 0, -5);
$do = $db_connect->prepare ("SELECT * FROM $table WHERE $dbQuery");
foreach($query as $id => $value) {
$do->bindParam(":".$id, $value, PDO::PARAM_INT);
}
$do->execute();
$result = $do->fetchAll();
return $result;
}
$dbResult = dbSelect("test",
$where = array(
"id" => 1,
"money" => 999,
)
);
echo "<xmp>".print_r($dbResult, true)."</xmp>";
?>
Så här ser resultatet ut när man bara anger id => 1
Array
(
[0] => Array
(
[id] => 1
[0] => 1
[name] => Look at me!
[1] => Look at me!
[money] => 999
[2] => 999
[id2] => 2
[3] => 2
)
)
Om man sedan lägger till money => 999
Array
(
)
spangoMedlem sedan juni 20008 205 inlägg
Tulork skrev:
Jag har fälten id och money med rätt värde och allt, båda INT. Skickar jag bara in 1 fråga i funktionen dbSelect() så returnerar den korrekt resultat. Men om jag skickar in 2 så returnerar funktionen en tom array.
Kan man inte använda bindParam() i en foreach på detta sätt?
Att anropen ligger i en foreach spelar ingen roll. Det är nåt annat som går snett. Ser den genererade SQL ser vettig ut?
Tulork skrev:
Fråga 2... för att optimera koden ännu mer vill man ju helst slippa bindParam foreach-satsen helt och istället köra bindParam i den första foreach-satsen. Möjligt ?
Ja, nämligen genom att göra som vanligt och formulera frågan själv utan att blanda in en generell funktion. DRY är en finfin princip men den går att dra till överdrift.
(Sen är det här också en fullständigt meningslös optimering, eftersom den lilla vinst/förlust man gör totalt kommer överskuggas av den tid det tar att ställa databasfrågan och läsa in svaret.)
TulorkMedlem sedan aug. 2004903 inlägg $dbQuery utprintat direkt efter foreach-satsen
WHERE id = :id AND money = :money
$do utprintat direkt efter foreach-satsen
PDOStatement Object
(
[queryString] => SELECT * FROM test WHERE id = :id AND money = :money
)
Kan inte se några fel här...
Vid utskrift av $id och $value i den sista foreach-satsen skrivs rätt värden ut... och de är av rätt typ (int).
TulorkMedlem sedan aug. 2004903 inlägg Löst.... måste köra en unset() på $value efter bindParam i varje loop.