Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: NULL kyselyssä

p99o [23.08.2013 12:34:32]

#

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 ...

Lebe80 [23.08.2013 12:37:37]

#

Voisikos toi :null olla suoraan kyselyssä ihan vaan NULL, vai tuleeko se sulla nyt kyselyyn jostain "muuttujasta".

qeijo [23.08.2013 13:20:00]

#

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

p99o [23.08.2013 15:00:58]

#

Mielestäni olen yrittäyt sitä ensimmäisenä.

Koitetaan nyt vielä kerran.

Metabolix [23.08.2013 15:33:07]

#

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.

The Alchemist [23.08.2013 15:48:17]

#

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());

p99o [23.08.2013 16:24:47]

#

homma selkis. Aivan omaa tyhmyttäni taas. Huoh.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta