Yritän suorittaa kyselyä (PDO) jossa haetaan vain (select) esim. sarake joka ei ole NULL.
Kysely on siis suurinpiirtein tämän näköinen.
$query = $dbconnection->prepare("SELECT ... taulu.sarake <> :null ORDER BY ... DESC LIMIT :limit1, :limit2");
Parametrit käsitellään:
$query->bindParam(':userid', $userid, PDO::PARAM_INT); $query->bindParam(':null', 'NULL', PDO::PARAM_NULL); $query->bindParam(':limit1', $limit1, PDO::PARAM_INT); $query->bindParam(':limit2', $limit2, PDO::PARAM_INT); $query->execute();
Katselin eri sivuja ja yritin mm. vaihtaa bindParam:n bindValue:ksi, eri vertailuja kyselyssä (IS NULL, <> :null, IS :null jne...).
PHP Netissä joku sanoi että 'null' tulisi olla muodossa 'null' pelkän null sijaan eli siis
$query->bindParam(':null', 'NULL', PDO::PARAM_NULL);
Vähän kaikkea jo koitettu...
Virheilmoitus Fatal error: Cannot pass parameter 2 by reference in C:\XAMP\htdoc ...
Voisikos toi :null olla suoraan kyselyssä ihan vaan NULL, vai tuleeko se sulla nyt kyselyyn jostain "muuttujasta".
Ilmeisesti NULL arvo on kuitenkin kovakoodattu joten kävisikö yksinkertaisesti:
SELECT taulu.sarake FROM taulu WHERE taulu.sarake IS NOT NULL
eli:
SELECT ... taulu.sarake IS NOT NULL ORDER BY ... DESC LIMIT :limit1, :limit2
Mielestäni olen yrittäyt sitä ensimmäisenä.
Koitetaan nyt vielä kerran.
Lue aina virheilmoitukset, ja jos et ymmärrä niitä, ota selvää äläkä ala säheltää.
Nytkin virheilmoituksessa sanotaan, että bindParam-metodin toiseksi parametriksi pitää antaa muuttuja, siis vaikka muuttuja $null, johon on sijoitettu arvo NULL. Pelkän arvon voi taas antaa metodilla bindValue.
Toki oikea ratkaisu tässä tilanteessa on tuo, jota qeijo ehdottaa, sillä ei ole mitään järkeä syöttää kyselyyn vakiota noin mutkikkaasti. Ehkä olet saanut siitä jonkin muun virheilmoituksen, jonka olet jättänyt lukematta. Virhe saattaa liittyä esimerkiksi parametrien käyttöön LIMIT-osassa.
Ei pidä sekoittaa PDO:n funktioita bindParam() ja bindValue().
$id = 1; $smt = $pdo->prepare('SELECT id FROM bar WHERE id = :id'); $smt->bindParam('id', $id); $id = 2; $smt->execute(); // Tulostaa 2 eikä 1! var_dump($smt->fetchColumn());
$id = 1; $smt = $pdo->prepare('SELECT id FROM bar WHERE id = :id'); $smt->bindValue('id', $id); $id = 2; $smt->execute(); // Tulostaa 1! var_dump($smt->fetchColumn());
homma selkis. Aivan omaa tyhmyttäni taas. Huoh.
Aihe on jo aika vanha, joten et voi enää vastata siihen.