为毛PDO查询过程会导致服务器断开?
$sql = "SELECT client_id, expires, scope FROM tokens WHERE oauth_token = :oauth_token"; $stmt = $this->db->prepare($sql); $stmt->bindParam(":oauth_token", $oauth_token, PDO::PARAM_STR); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC);
跟踪了半天,发现执行到$stmt->execute();的时候就会出现这样的问题
而奇怪的是,同个页面另一个函数却正常:
$sql = "SELECT code, client_id, redirect_uri, expires, scope FROM auth_codes WHERE code = :code"; $stmt = $this->db->prepare($sql); $stmt->bindParam(":code", $code, PDO::PARAM_STR); $stmt->execute();
经过调试,参数里的数据没一点问题,改成Mysql驱动获取数据就一切正常,所以数据是没问题的。会是什么问题呢?有人遇到过这样的问题吗?
回复讨论(解决方案)
信息太少,不好判断。
打开错误提示没有,有不有错误信息。
检查数据库连接
参考:http://www.php.net/manual/en/pdo.error-handling.php
出错原因是,select中没有oauth_token字段。
$sql = "SELECT client_id, expires, scope FROM tokens WHERE oauth_token = :oauth_token";
$stmt = $this->db->prepare($sql);
$stmt->bindParam( ":oauth_token", $oauth_token, PDO::PARAM_STR);
$sql = "SELECT code, client_id, redirect_uri, expires, scope FROM auth_codes WHERE code = :code";
$stmt = $this->db->prepare($sql);
$stmt->bindParam( ":code", $code, PDO::PARAM_STR);
信息太少,不好判断。
打开错误提示没有,有不有错误信息。
打开错误提示的,其它错误都能显示,到这里的时候不显示错误,直接就服务器断开连接了,跟踪调试了下,发现程序是有运行的,但是到$stmt->execute()这一步就挂了。
出错原因是,select中没有oauth_token字段。
$sql = "SELECT client_id, expires, scope FROM tokens WHERE oauth_token = :oauth_token";
$stmt = $this->db->prepare($sql);
$stmt->bindParam( ":oauth_token", $oauth_token, PDO::PARAM_STR);
$sql = "SELECT code, client_id, redirect_uri, expires, scope FROM auth_codes WHERE code = :code";
$stmt = $this->db->prepare($sql);
$stmt->bindParam( ":code", $code, PDO::PARAM_STR);
这个是查询条件里的参数,跟Select里的字段有什么关系????
补充:直接拼接SQL,然后用$this->db->query也不行。
很奇怪的问题,后来全部改成Mysql直接读写了,不通过PDO了,但是这个问题没找到原因,心里很不舒服。
你总是得贴出错误信息的!
另外,如果你的 php 版本低于 5.3 的话,建议还是不要用 PDO(总是有些莫名其妙的错误的)
你总是得贴出错误信息的!
另外,如果你的 php 版本低于 5.3 的话,建议还是不要用 PDO(总是有些莫名其妙的错误的)
已经说了,没有错误信息,直接停止运行了,同时服务器断开了连接,浏览器显示无法连接服务器的提示。
print_r($this->db->errorInfo());
print_r($this->db->errorInfo());
没有信息。
声明一点,所有基本的调试方法我都试过了,包括将错误信息写到文本文档里,因为服务器断开连接了,所以有任何信息都是没办法看到的,所以就写到文件里了,但是文件里也是没有错误信息,而且证明了到那个语句的时候后面的所有语句都不运行了,应该是服务器停止脚本运行并断开了连接。
没有信息?那可不对约
即便是没有错误(错误号为 0000)也是有输出的
可实际情况就是这样,错误号为0还是空我忘了,反正没有表示出错的信息输出。
再者,无论出什么错误,如果有错误信息输出,那也不至于服务器会断开连接,应该是其它原因,但是不知道是什么问题。
贴全代码,肯定有错误。
SELECT client_id, expires, scope FROM tokens WHERE oauth_token = :oauth_token
直接拿sql放到mysql编辑器执行试试。
贴全代码,肯定有错误。
我给的代码已经够全了。无非是数据库连接那部分没给出来,但是那个肯定没错,是公共调用的,同个库,其它都运行正常。
SELECT client_id, expires, scope FROM tokens WHERE oauth_token = :oauth_token
直接拿sql放到mysql编辑器执行试试。
调试的最基本方法,我早试过了,SQL查询语句没有一点问题,要不然在我的电脑上就不能运行了,只是移到阿里云服务器上后这里就挂了,换成Mysql直接查询一切正常。
阿里云服务器 支持 PDO 吗?
请找管理员核实一下
阿里云服务器 支持 PDO 吗?
请找管理员核实一下
这不是查看phpinfo()就可以看得到?
阿里云服务器 支持 PDO 吗?
请找管理员核实一下
帖子里说明了,另一处正常,就这里不正常,不支持的话另一处能正常吗?
好!
1、pdo 出错,mysql 不出错
2、一处正常,一处不正常
显然问题出在不正常的程序中
mysql 没有 prepare 和 bindParam
你说错误应在哪里?
好!
1、pdo 出错,mysql 不出错
2、一处正常,一处不正常
显然问题出在不正常的程序中
mysql 没有 prepare 和 bindParam
你说错误应在哪里?
程序很正常,至少在开发环境一切正常。
要是知道错误在哪,就不用来这问了。
检查代码里有没有$this->db=NULL;
是不是清空了?
你有客户端吧,客户端总会给你打印出一些东西的,例如
你访问了你的a.php 这个是操作pdo的,你在服务器上的apache/nginx查看不到所有的log?如果看不到那你就看看客户端上服务器response的http code是什么 message是什么,总有办法的。
PDO 我碰见过如果用长连接 会导致一些网页直接挂掉。
检查代码里有没有$this->db=NULL;
是不是清空了?
没有,该有的代码我都贴出来了,除了公用的连接数据库的。、
注意一点:本地正常,服务器上不正常。要是清空了,本地一样也有问题。
奇怪的问题,没有解决。
不管了,准备散分。。。
我今天也遇到了同样的问题。。PDO执行select查询导致apache直接断开,查询了PHP log和apche log都没有错误反馈。。但是执行UPDATE/INSERT没有问题,再测试发现执行select a from table可以,但是select a,b from table就立马挂掉,不知道什么原因。
我今天也遇到了同样的问题。。PDO执行select查询导致apache直接断开,查询了PHP log和apche log都没有错误反馈。。但是执行UPDATE/INSERT没有问题,再测试发现执行select a from table可以,但是select a,b from table就立马挂掉,不知道什么原因。 估计是硬伤了,以后不用这玩意了。结帖啦。。。。