Neden Hazırlanan bu tablolar işe yaramazsa?

2 Cevap php

Ben NetBeans 6.8 kullanın ve benim mac bu yapılandırma ile mAmp var:

Apache 2.0.63
MySQL 5.1.37
PHP 4.4.9 & 5.2.10
APC 3.0.19 & APC 3.1.2
eAccelerator 0.9.5.3
XCache 1.2.2
phpMyAdmin 2.11.9.5 & phpMyAdmin 3.2.0.1
Zend Optimizer 3.3.3
SQLiteManager 1.2.0
Freetype 2.3.9
t1lib 5.1.2
curl 7.19.5
jpeg 7
libpng-1.2.38
gd 2.0.34
libxml 2.7.3
libxslt 1.1.24
gettext 0.17
libidn 1.15
iconv 1.13
mcrypt 2.5.8
YAZ 3.0.47 & PHP/YAZ 1.0.14

MySQL için Benim PDO Sürücü istemci kütüphanesi sürümü 5.1.37 olduğunu

Burada hazır deyimleri kullanmaya çalışın.

Hazırlanan bu tabloların OLMADAN mükemmel çalışıyor:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"');
    //$prepared->bindParam('foo', 'root');

    $prepared->execute();

    foreach($prepared as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Ama bu bir hazır deyimi ile hiç çalışmıyor. Bunu yaparken tamamen boş bir sayfa alıyorum:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=:foo');
    $prepared->bindParam('foo', 'root');

    $prepared->execute();

    foreach($prepared as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

fan kök ile değiştirilmesi gerekir. Ancak, bu değil. Tamam, bu yüzden de hiç çalışmıyor, hangi deneyelim:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=?');
    $prepared->bindParam(1, 'root');

    $prepared->execute();

    foreach($prepared as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Kesinlikle hiçbir şey. Ben bile bir hata mesajı alamadım. Sadece bir boş sayfa. Bu kod sonra, standart HTML çıkışı ile bazı yankı var. O dışarı gitmez, bu yüzden komut bindParam yöntemi çağrısı yakın bir yerde durur.

Yine, bu bir herhangi bir hazır deyimi olmadan mükemmel çalışıyor:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"');
    //$prepared->bindParam('foo', 'root');

    $prepared->execute();

    foreach($prepared as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Gördüğünüz gibi, belli ki tüm sürümleri tam olarak aynı sorgu vardır. PS çalışmıyor ile. PS olmadan yapar. Şimdi PHP kendisi acımasız bir hata bulduk?

Bu hazırlanan tablolar yere devre dışı olması mümkün mü?

2 Cevap

Bağlama adı :foo - değil foo. Eğer argüman olarak bir değişken vermiyorum çünkü Ve sen, bindParam kullanmak, ancak bindValue olmamalıdır. Örn. :

$prepared->bindValue(':foo', 'root');

Genel olarak, ben seni never, referans anlambilim beri, bindParam kullanabilir ve böylece bazı gerçekten zor-nokta hataları oluşturabilirsiniz öneriyoruz.

Bu kod bu tür kullanıyor:

$prepared->bindParam('foo', 'root');

Ama bindParam is expecting a variable, ikinci parametre olarak:

bool PDOStatement::bindParam  ( mixed $parameter  , 
    mixed &$variable  [, int $data_type = PDO::PARAM_STR  [, int $length  
    [, mixed $driver_options  ]]] )


Here, you should probably use bindValue, as you only want to bind a... value... and not a variable passed by reference to the SQL query :

bool PDOStatement::bindValue  ( mixed $parameter  , mixed $value  
    [, int $data_type = PDO::PARAM_STR  ] )

Yani, kodunuzu gibi görünecektir:

$prepared->bindValue(':foo', 'root');

(Don't forget the ': 'param name önce btw ;-))