无法从php脚本访问表数据

无法从php脚本访问表数据,php,mysql,database,Php,Mysql,Database,我有一个脚本正在访问远程MySQL数据库。这个数据库有多个表,记录超过40亿条(是的,我的意思是10亿条) 今天,我创建了一个新表,其中包含大约630万条记录。当我通过Sequel Pro访问数据库,尤其是新表时,我能够从数据库中的任何表进行查询并获取数据,而不会出现任何问题,这包括访问我刚刚创建的新表 问题是:当我通过PHP使用相同的用户凭据访问相同的数据库时,我无法访问刚刚创建的新表。我可以访问数据库中其他每个表中的数据,但不能访问我创建的新表 以下是我尝试过的: 我首先尝试通过PDO进行连

我有一个脚本正在访问远程MySQL数据库。这个数据库有多个表,记录超过40亿条(是的,我的意思是10亿条)

今天,我创建了一个新表,其中包含大约630万条记录。当我通过Sequel Pro访问数据库,尤其是新表时,我能够从数据库中的任何表进行查询并获取数据,而不会出现任何问题,这包括访问我刚刚创建的新表

问题是:当我通过PHP使用相同的用户凭据访问相同的数据库时,我无法访问刚刚创建的新表。我可以访问数据库中其他每个表中的数据,但不能访问我创建的新表

以下是我尝试过的:
我首先尝试通过PDO进行连接和查询。当这不起作用时,我尝试使用mysqli进行连接和查询。这两种方法都不起作用。为了确保脚本中没有遗漏任何内容,我创建了下面的脚本,该脚本获取数据库中每个表的列表,然后访问每个表,获取2条记录,并将它们输出到屏幕:

试试看{
$db=new-PDO('mysql:host=IP\u地址;port=port\u编号;dbname=db\u名称'、'db\u用户'、'db\u密码'[
PDO::ATTR_PERSISTENT=>true
]);
}捕获(PDO$e){
打印“错误!:”$e->getMessage()。“
”; 模具(); } $query=$db->query('SHOW TABLES'); $results=$query->fetchAll(PDO::FETCH_列); foreach(结果为$r){ 回音“

”.$r.“
”; $res=$db->query(“从`.$r.`LIMIT 2中选择*”; foreach($res作为$row){ 回声“
”; 打印(行); } }
此脚本能够从每个表(新表除外)检索记录。

更多信息:
-这是远程托管的Windows 10计算机上的MySQL数据库。
-用户可以完全访问数据库中的所有表。
-我使用默认的DB选项创建了表:编码:utf8,排序规则:utf8\u常规\u ci,表类型:InnoDB
-表格是使用插入表格名称从Sequel Pro创建的 选择。。。。。陈述

-我正在使用MAMP Pro使用Macbook Pro访问数据库,我没有真正更改任何默认的PHP设置。

因此,如果这对其他人有帮助,我会感到惊讶。但解决我问题的方法是向表中添加另一个字段。我是通过Sequel Pro的“结构”界面做到这一点的。因为我的表有640万条记录,所以添加字段需要一点时间,但一旦完成,我就能够通过PHP访问表而没有任何问题。

因此,如果这对其他人有帮助,我会感到惊讶。但解决我问题的方法是向表中添加另一个字段。我是通过Sequel Pro的“结构”界面做到这一点的。因为我的表有640万条记录,所以添加字段需要一些时间,但一旦完成,我就可以通过PHP访问该表,而不会出现任何问题。

您没有检查错误。PDO中没有启用异常,因此它在失败时只返回布尔值false,而您没有检查该false返回值。这意味着你只是假设一切都会完美地工作,永远不会失败。永远不要假设成功。始终假设失败,检查失败,并将成功视为惊喜。@MarcB感谢您关于错误检查的建议,但正如我之前所述,我尝试了PDO和mysqli,并得到了相同的结果。我可以访问数据库中的每个表,但我刚刚创建的表除外。我没有发布它,但是我使用的mysqli代码包含了这个错误检查:
if($mysqli->connect_error){die('connect error('.$mysqli->connect_errno.')。$mysqli->connect_error);}
在这种情况下,检查连接错误是毫无用处的。你确实联系上了。您只是假设query()调用从未失败。这就像开车撞到车库墙的后面,然后说“一切都很好,我在高速公路上没有撞到任何东西”。您需要检查每个db查询调用是否失败,而不仅仅是连接。@MarcB当我在PDO查询之后立即使用
$db->errorInfo()
时。我得到以下结果:
Array([0]=>00000[1]=>[2]=>)
哪个查询?展示台?这显然很有效,因为你还有其他桌子。那么
select
查询呢?您没有检查错误。PDO中没有启用异常,因此它在失败时只返回布尔值false,而您没有检查该false返回值。这意味着你只是假设一切都会完美地工作,永远不会失败。永远不要假设成功。始终假设失败,检查失败,并将成功视为惊喜。@MarcB感谢您关于错误检查的建议,但正如我之前所述,我尝试了PDO和mysqli,并得到了相同的结果。我可以访问数据库中的每个表,但我刚刚创建的表除外。我没有发布它,但是我使用的mysqli代码包含了这个错误检查:
if($mysqli->connect_error){die('connect error('.$mysqli->connect_errno.')。$mysqli->connect_error);}
在这种情况下,检查连接错误是毫无用处的。你确实联系上了。您只是假设query()调用从未失败。这就像开车撞到车库墙的后面,然后说“一切都很好,我在高速公路上没有撞到任何东西”。您需要检查每个db查询调用是否失败,而不仅仅是连接。@MarcB当我在PDO查询之后立即使用
$db->errorInfo()
时。我得到以下结果:
Array([0]=>00000[1]=>[2]=>)
哪个查询?展示台?这显然很有效,因为你还有其他桌子。关于
select
查询的情况如何?
 try {
    $db = new PDO('mysql:host=IP_ADDRESS;port=PORT_NUMBER;dbname=DB_NAME', 'DB_USER', 'DB_PASSWORD', [
        PDO::ATTR_PERSISTENT => true
     ]);
 } catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
 }

 $query = $db->query('SHOW TABLES');
 $results = $query->fetchAll(PDO::FETCH_COLUMN);

 foreach ($results as $r) {
    echo '<br><br>' . $r . '<br>';
    $res = $db->query("SELECT * FROM `" . $r . "` LIMIT 2");

    foreach ($res as $row) {
        echo '<br>';
        print_r($row);
    }
 }