PHP: PDOStatement basit MySQL Select çalışmıyor

5 Cevap php

Ben şu PHP kodu bir tabloya çok basit bir seçme yapan var.

$statement = $db->prepare("SELECT * FROM account WHERE fbid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
print_r($out) // 1;
//$out = $statement->execute(array(':fbid' => $uid)); // also doesn't work
$row = $statement->fetch();

$out (başarı) doğrudur ama $row null.

EDIT:

$statement->debugDumpParams();

Çıkışlar

SQL: [40] SELECT * FROM account WHERE fbid = :fbid Params: 1 Key: Name: [5] :fbid paramno=-1 name=[5] ":fbid" is_param=1 param_type=2

Ben şöyle kodunu değiştirmek durumunda:

$statement = $db->prepare("SELECT * FROM account WHERE fbid = $uid");
$out = $statement->execute();
$row = $statement->fetch();

$row Ben bekliyordum kayıt içerir.

Ben bir kayıp değilim. I) (hazırlamak :: PDO kullanıyorum, bindParams (vb) SQL Enjeksiyon saldırılarına karşı korunmak için (belki de ben bu konuda yanılmıyorsam).

EDIT: In my example, $uid is a numerical string (ie a string containing only numbers). In the database, the column type is VARCHAR(45)

EDIT:

Ben BIGINT için VARCHAR (45) adlı veritabanı türünü değiştirirseniz, hem sorguları çalışır. Ben yine VARCHAR (45) geri veritabanı türü türünü değiştirirseniz, o inşaat. Peki ne oluyor?

Halp Lütfen.

5 Cevap

Ben senin PDO yükleme ile ilgili bir sorun olabileceğini düşünüyorum.

$uid = 552192373; // my facebook uid for testing
$statement = $db->prepare("SELECT * FROM users WHERE facebook_uid = :fbid");
$statement->bindParam(":fbid",$uid, PDO::PARAM_STR,45);
$out = $statement->execute();
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo '<pre>';
print_r($row);
echo '</pre>';

döner:

Array
(
    [id] => 1
    [facebook_name] => Jason Boehm
    [facebook_uid] => 552192373
)

Size fbid değerini kontrol etmeniz gerekir. tamsayı değeri (imzasız), sadece (string) $ uid tarafından döküm iş değildir, ve sprintf ("% .0 f", ...) 2 ^ 32 den büyük ise o zaman dize olmalıdır yalnızca tamsayı değeri çalışır olacak az 2 ^ 52, 32-bit işletim sistemi üzerinde bir sayı (işaretsiz 32) PHP çift türü olduğunu varsayalım ve kesin varsayılan 2 ^ 31 daha büyük olduğu için sadece 14 ondalık ama 20 fbid olduğunu.

Siz dizesinde fbid tutmak zorunda PHP sadece [0-9], o MySQL BIGINT veya VARCHAR olarak depolanır farketmez içeriyor, MySQL, sadece dize sql deyimi kabul eder ve her zaman dize biçiminde sonuç verir.

$mi = new mysqli("localhost", "root", "xxx", "test");
$uid = "12379739851403943597";   // Works
//$uid = 12379739851403943597;   // never Works
//$uid = (string) 12379739851403943597;   // get "1.2379739851404E+19" wrong string !
//$suid = sprintf("%.0f", $uid);          // get "12379739851403943936" lost precise

$stmt = $mi->prepare("select * from bitest where id = ?");
$stmt->bind_param('s', $uid);

$stmt->execute();
$stmt->bind_result($id, $name);

$stmt->store_result();
print "numrow: " . $stmt->num_rows . " - \n";
$stmt->fetch();
print "$id - $name \n";
$stmt->free_result();

$stmt->close();


$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'xxx');
$sql = "select * from bitest where id = ?";

$sth = $pdo->prepare($sql);
$sth->bindParam(1, $uid, PDO::PARAM_STR);

$sth->execute();
var_dump($sth->fetchAll(PDO::FETCH_ASSOC));

Bir süre oldu ... execute yerine bir hash geçen deneyin:

$statement->execute(array( 'fbid' => $uid ));

Belki PDO :: PARAM_INT deneyin

Bunun dışında, (), bir referans olarak değişken alır zihin bindParam tutmak. Belki demo kodu) (yürütmek önce bu değişkenin değerini değiştirerek görünmüyor denir. Gerekirse () bindValue bakın.

Ekstra parametre bırakarak deneyin,

$statement->bindParam (":fbid", $uid, PDO::PARAM_STR);

(edit) Are you 100% positive there is no extra whitespace surrounding the UID? Test with trim() and pass by value:

$statement->bindValue (":fbid", trim($uid), PDO::PARAM_STR);