2010-03-24 66 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));