我正在使用PHP PDO来运行查询。我有以下功能:
protected function isStoreRegistered($name, $street1 ,$city, $country_id, $id) {
if($id == '0') {
$sql = " SELECT a.name, b.street1, b.city, c.id
FROM tablea a
LEFT JOIN tableb b ON a.fk_addressID = b.id
LEFT JOIN tablec c ON b.fk_countryID = c.id
WHERE a.name = '$name'
AND b.street1 = '$street1'
AND b.city = '$city'
AND b.fk_countryID = '$country_id'";
$result = $this->db->exec($sql);
} else {
// some other query
}
return $result;
}
发送给MySQL的查询如下所示:
SELECT a.name, b.street1, b.city, c.id
FROM sl_store a
LEFT JOIN sl_address b ON a.fk_addressID = b.id
LEFT JOIN sl_country c ON b.fk_countryID = c.id
WHERE a.name = 'test store'
AND b.street1 = 'Weselsgate 2'
AND b.city = 'Oslo'
AND b.fk_countryID = 'NO'
在Toad中运行此查询,返回1行。
但如果我执行print_r(result)
,则输出0
(零)
我怎样才能找出这里有什么问题?
答案 0 :(得分:2)
来自docs:
PDO :: exec()不返回SELECT语句的结果。
由于您没有修改任何内容(没有插入,删除或更新),因此没有受影响的行,这是PDO::exec
返回的行。
如果您希望数据使用预先准备的语句或PDO::query
。如果您想要行数,请在您的选择中使用计数。
答案 1 :(得分:1)
如前所述和手册中所述,PDO::exec()
不会返回SELECT
语句的结果。相反,你应该尝试以下(注意参数绑定):
protected function isStoreRegistered($name, $street1 ,$city, $country_id, $id) {
if ($id == '0') {
$sql = " SELECT a.name, b.street1, b.city, c.id
FROM tablea a
LEFT JOIN tableb b ON a.fk_addressID = b.id
LEFT JOIN tablec c ON b.fk_countryID = c.id
WHERE a.name = :name
AND b.street1 = :street
AND b.city = :city
AND b.fk_countryID = :country";
$stmt = $this->db->prepare( $sql );
$vars = array(
'name' => $name,
'street' => $street1,
'city' => $city,
'country' => $country_id,
);
$result = $stmt->execute( $vars );
} else {
// some other query
}
return $result;
答案 2 :(得分:0)
exec
返回受语句影响的行数,
在你的情况下,因为你正在做一个选择
docs: - http://php.net/manual/en/pdo.exec.php
你的sql没有以正确的方式使用PDO,
易受SQL注入攻击,
花了一些时间阅读parameters binding