Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将复杂SQL语句转换为PDO_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 将复杂SQL语句转换为PDO

Php 将复杂SQL语句转换为PDO,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我有下面的sql语句,它工作得非常完美,因为我正在将所有内容传输到PDO,所以我在转换这个复杂的语句时遇到了最糟糕的情况。以下是它的工作原理: $sql_res=mysql_query("SELECT a.first_name, a.last_name, a.uid, a.hometown, IF(b.friend_two IS NULL, 0, 1) AS isFriend FROM users a LEFT JOIN friends b ON a.uid = b.friend_two A

我有下面的sql语句,它工作得非常完美,因为我正在将所有内容传输到PDO,所以我在转换这个复杂的语句时遇到了最糟糕的情况。以下是它的工作原理:

$sql_res=mysql_query("SELECT a.first_name, a.last_name, a.uid, a.hometown, 
IF(b.friend_two IS NULL, 0, 1) AS isFriend FROM users a LEFT JOIN friends 
b ON a.uid = b.friend_two AND b.friend_one = $uid WHERE  
CONCAT(a.first_name, ' ', a.last_name) LIKE '%$q%' AND a.uid <> $uid 
ORDER BY isFriend DESC");
$sql\u res=mysql\u query(“选择a.first\u name、a.last\u name、a.uid、a.home、,
如果(b.friend_two为NULL,0,1)作为isFriend从用户a左加入好友
b在a.uid=b.friend_二和b.friend_一上=$uid其中
CONCAT(如“%$q%”和a.uid$uid
由isFriend DESC)订购;
我已经尝试了几个小时来转换,这是我从另一个S.O示例中所能得到的全部(它甚至还没有工作)

任何帮助都是非常感谢的。噢,$q也是用户的POST变量,所以PDO在我的情况下是必须的

更新代码(第二次):

$sql=“选择a.first\u name、a.last\u name、a.uid、a.home、,
如果(b.friend_two为NULL,0,1)作为isFriend从用户a左连接
a.uid=b.friend\u two和b.friend\u one=:friend\u one
其中(名字如concat(“%”,:fname,“%”)或姓氏如
concat(“%”,:lname,“%”)和a.uid:uid按isFriend DESC排序;
$stmt=$db->prepare($sql)$stmt->bindValue(':fname',“%$q%”,PDO::PARAM_STR);
$stmt->bindValue(':lname',“%$q%”,PDO::PARAM_STR);
$stmt->execute(数组(':friend\u one'=>$uid':uid'=>$uid));

这可以正常工作,但无法产生与原始sql语句相同的结果。

从中删除额外的
,并将
()
放在您的姓名筛选器周围,如
A或B和C
=
A或(B和C)
,还有您想要的客人
(A或)B和C

选择
a、 名字,
a、 姓,
a、 uid,
a、 家乡,
如果(b.friend\u two为NULL,0,1)作为isFriend
来自用户a
左加入朋友b
关于a.uid=b.friend\u二和b.friend\u一=:uid
哪里
(
第一个名称,如concat(“%”,:fname,“%”)或
姓氏,如concat(“%”,:lname,“%”)
)及
a、 uid:uid
订购人
isFriend DESC

它是如何“不工作”的?@Marc B:PDO可能很难调试,因为您无法始终看到返回的错误PDO errno和errcode不够?我同意如果他们什么都没说是很困难的,但即使不检查他们也是很懒惰的…你
后面缺少的
仅仅是一个复制粘贴错误,或者是你的php代码中的错误吗?你还有2个
来自用户
谢谢你的回答,帕根。这是我的代码,它非常接近$sql=“选择a.first_name,a.last_name,a.uid,a.homitory,如果(b.friend_two为NULL,0,1)作为来自用户的isFriend a左加入a.uid=b.friend_two和b.friend_one=:uid其中(名字像concat('%,:fname,“%”)或姓氏像concat('%,:lname,“%”)和a.uid“1”由isFriend DESC排序$stmt=$db->prepare($sql)$stmt->bindValue(“:fname”,“%$q%”,PDO::PARAM_STR)$stmt->bindValue(':lname','%$q%',PDO::PARAM_STR)$stmt->execute(数组(':uid'=>$uid));但我最终得到了一个错误,“Mysql\u fetch\u array()希望参数1是资源,对象是给定的”。我仍然不明白我做错了什么。?,
mysql_fetch_array()
不是PDO函数对不起,我是说,$row=$stmt->fetch()){……我让它正常工作了,但它似乎在读取CONCAT(a.first_name,,,a.last_name)函数与以前不同,因为现在,我没有得到任何结果。一切运行都没有错误,但遗憾的是没有结果。您将%与:fname关联,因此在bind语句中不需要%与
bindValue(':fname',“%$q%”关联。
$sql = "select a.first_name, a.last_name, a.uid, a.hometown, 
IF(b.friend_two IS NULL, 0, 1) AS isFriend FROM users a LEFT JOIN 
friends b ON a.uid = b.friend_two AND b.friend_one = :friend_one 
where ( first_name like concat('%', :fname, '%') or last_name like 
concat('%', :lname, '%') ) and a.uid <> :uid ORDER BY isFriend DESC"; 
$stmt= $db->prepare($sql); $stmt->bindValue(':fname', "%$q%", PDO::PARAM_STR); 
$stmt->bindValue(':lname', "%$q%", PDO::PARAM_STR); 
$stmt->execute(array(':friend_one' => $uid,':uid' => $uid));
select
  a.first_name,
  a.last_name,
  a.uid,
  a.hometown,
  IF(b.friend_two IS NULL, 0, 1) AS isFriend 
FROM users a 
LEFT JOIN friends b
  ON a.uid = b.friend_two AND b.friend_one = :uid
where 
  (
    first_name like concat('%', :fname, '%') or 
    last_name  like concat('%', :lname, '%') 
  ) and
  a.uid <> :uid 
ORDER BY
  isFriend DESC