2010-03-24 76 views
1

我有以下PHP代碼做一個非常簡單的選擇到表中。PHP:PDOStatement簡單MySQL選擇不起作用

$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是真實的(成功),但$row爲空。

編輯:

$statement->debugDumpParams();

輸出

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

如果我修改代碼如下:

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

$row包含我期望的記錄。

我不知所措。我正在使用PDO :: prepare(),bindParams()等來防止SQL注入(可能我錯了)。

編輯: 在我的例子中,$ uid是一個數字字符串(即只包含數字的字符串)。在數據庫中,列類型爲VARCHAR(45)

編輯:

如果我從VARCHAR(45),以BIGINT更改數據庫類型,這兩個查詢工作。如果我再次將數據庫類型中的類型更改回VARCHAR(45),它將起作用。那麼是什麼給了?

請halp。

+0

你可以張貼的print_r($出)的'結果;' – Jayrox 2010-03-24 04:23:21

+0

@jayrox:這是1 – Alan 2010-03-24 04:25:33

+0

確定,對媽和笑聲嘗試沒有',PDO :: PARAM_STR,45'在bindParam – Jayrox 2010-03-24 04:34:31

回答

0

我認爲您的PDO安裝可能存在問題。

$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>'; 

回報:

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

'$ row'仍然爲空 – Alan 2010-03-24 04:27:14

0

它已經有一段時間...嘗試通過散列值來代替execute

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

+0

也嘗試過。沒有骰子。 – Alan 2010-03-24 04:23:34

+0

您是否嘗試過使用位置參數而不是命名? ''SELECT * FROM account WHERE fbid =?「'and'execute(array($ uid))'? – Charles 2010-03-24 04:56:19

+0

是的,也試過了。 – Alan 2010-03-24 05:17:54

0

嘗試丟棄額外的參數,

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

(編輯) 你100 %正面沒有額外的UID周圍的空白?測試與trim()和按值傳遞:

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

$行仍爲空 – Alan 2010-03-24 04:29:06

0

也許嘗試PDO :: PARAM_INT

除此之外,記住bindParam()主罰變量作爲參考。也許你的演示代碼沒有顯示你在調用execute()之前改變這個變量的值。如果需要,請參閱bindValue()。

+0

將其更改爲int,不返回結果。另外,我做了$ uid值的「回聲」,這就是我所期望的。我也試過bindValue(),那也不管用。 – Alan 2010-03-24 04:31:26

1

你需要檢查你的FBID值。如果它的整數值大於2^32(無符號),則簡單地由(字符串)轉換$ uid不起作用,並且sprintf(「%。0f」,...)僅適用於小於2^52的整數值,因爲在32位操作系統中,當數字大於2^31(32無符號)時,PHP將假定它是雙精度型,默認精度僅爲14十進制,但fbid爲20

你必須在PHP中保持字符串中只包含[0-9],無關緊要它在MySQL中存儲爲BIGINT或VARCHAR,MySQL只接受字符串sql語句並始終以字符串格式返回結果。

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