欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

为毛PDO查询过程会导致服务器断开?

程序员文章站 2022-06-12 08:54:25
...
今天帮人改个程序,测试一切正常后,发过去,在服务器上出现问题,访问某个页面的时候就会出现页面打不开的提示,让检查网络,貌似是服务器断开了连接。

      $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就立马挂掉,不知道什么原因。 估计是硬伤了,以后不用这玩意了。结帖啦。。。。