Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php] PDO en prepared statements werkt niet?

Pagina: 1
Acties:

Onderwerpen


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 28-11 22:59

alienfruit

the alien you never expected

Topicstarter
Ik ben momenteel bezig met het schrijven van een kleine module voor een CMS systeem. Omdat de data in een andere database is opgeslagen. Maak ik gebruik van PDO alleen ik heb een probleem met de prepare()-functionaliteit.

PHP:
1
2
3
4
5
6
7
8
9
10
$sql = "SELECT p.id, p.post_title, p.post_name, p.post_excerpt, p.post_date, p.post_status, p.post_type,
wp_users.display_name AS post_author
FROM `wp_posts` AS p
LEFT OUTER JOIN `wp_users` ON p.post_author = wp_users.ID
WHERE p.post_status = 'publish' AND p.post_type='post' LIMIT 0, :limit";

// execute the sql query
$statement = $connection->prepare( $sql );
$statement->bindParam(':limit', 4, PDO::PARAM_INT);
 $statement->execute();


Als ik vervolgens debugDumpParams() aanroep krijg ik de volgende waarde terug:

code:
1
2
3
4
5
6
7
8
9
10
11
SQL: [331] SELECT p.id, p.post_title, p.post_name, p.post_excerpt, p.post_date, p.post_status, p.post_type,
            wp_users.display_name AS post_author
            FROM `wp_posts` AS p
            LEFT OUTER JOIN `wp_users` ON p.post_author = wp_users.ID
            WHERE p.post_status = 'publish' AND p.post_type='post' LIMIT 0, :limit
Params:  1
Key: Name: [6] :limit
paramno=-1
name=[6] ":limit"
is_param=1
param_type=1


Het is mij niet duidelijk waarom dit niet zo moeten werken? Iemand enig idee?

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 13:41

Matis

Rubber Rocket

Je moet een variabele assignen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$limit = 4;
$sql = "SELECT p.id, p.post_title, p.post_name, p.post_excerpt, p.post_date, p.post_status, p.post_type,
wp_users.display_name AS post_author
FROM `wp_posts` AS p
LEFT OUTER JOIN `wp_users` ON p.post_author = wp_users.ID
WHERE p.post_status = 'publish' AND p.post_type='post' LIMIT 0, :limit";

// execute the sql query
$statement = $connection->prepare( $sql );
$statement->bindParam(':limit', $limit, PDO::PARAM_INT);
 $statement->execute();
?>

Welkom in de wonderenwereld van PHP + PDO :)

If money talks then I'm a mime
If time is money then I'm out of time


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 28-11 22:59

alienfruit

the alien you never expected

Topicstarter
Nu werkt het wel! Vaag, ik had eerst ook $limit gebruikt. Kan het zijn dat fout gaat als de $limit een string waarde is ipv. een integer?

edit:
Ja, dus... geeft dan een waarschuwing of een foutmelding.

[ Voor 21% gewijzigd door alienfruit op 27-01-2011 10:01 ]


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
alienfruit schreef op donderdag 27 januari 2011 @ 09:58:
Nu werkt het wel! Vaag, ik had eerst ook $limit gebruikt. Kan het zijn dat fout gaat als de $limit een string waarde is ipv. een integer?

edit:
Ja, dus... geeft dan een waarschuwing of een foutmelding.
Ja, want daarnaast geef je het type mee dmv PDO:PARAM_INT. PHP zou het (in theorie) gewoon kunnen converteren dmv de typeconversieregels, maar blijkbaar gaat dat niet helemaal goed. Wel apart dat je geen constanten in die functie kunt gebruiken blijkbaar, overigens.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
YopY schreef op donderdag 27 januari 2011 @ 11:49:
Wel apart dat je geen constanten in die functie kunt gebruiken blijkbaar, overigens.
Dat zal (gut-feel hoor) te maken hebben dat er ook een return value via die variabele gereturned kan worden?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Jory
  • Registratie: Mei 2006
  • Laatst online: 28-11 23:25
@Matis: Bij bindParam() moet je inderdaad een variable meegeven. Deze word dan tijdens de exec ge-evalueerd (de variable wordt by-reference doorgegeven). Hierdoor zou je zoiets kunnen doen:
PHP:
1
2
3
4
5
6
7
8
9
$sQuery = "...";
$oStmt = $oConnection->prepare($sQuery);

$iCounter = 0;
$oStmt->bindParam(':counter', $iCounter, PDO::PARAM_INT);

for(; $iCounter < 42; $iCounter++) {
 $oStmt->execute();
}

Dat is dus iedere keer een andere query.

Of dit een nuttige feature is, is een ander verhaal, maar dat is hoe het werkt (en hoe het is gedocumenteerd.)
(@RobIII, de variable wordt niet aangepast, geen verkapte return value, gelukkig.:) )

Het gedrag wat jullie verwachten, is het gedrag dat bindValue() vertoond.

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 25-11 00:51
Jory167 schreef op donderdag 27 januari 2011 @ 18:53:
...
Of dit een nuttige feature is, is een ander verhaal, maar dat is hoe het werkt (en hoe het is gedocumenteerd.)
(@RobIII, de variable wordt niet aangepast, geen verkapte return value, gelukkig.:) )
...
Nou, dat zeg je nu wel... maar via bindParam kan een execute() op een PDOStatement een type conversie doen en dan wel de variabele aanpassen...

Een voorbeeld, zie ook het commentaar bij http://www.php.net/manual/en/pdostatement.bindparam.php waar het schaamteloos van geleend is:
PHP:
1
2
3
4
5
6
7
8
    $value = 1;
    var_dump($value);

    $stmt->bindParam( ':value', $value, PDO::PARAM_INT );
    var_dump($value);

    $stmt->execute();
    var_dump($value);


Output:
code:
1
2
3
int(1)
int(1)
string(1) "1"


Ik weet niet of dat inmiddels al verbeterd is. Best wel tricky. Het blijft mooi wark, PDO. :Y
Pagina: 1