【问题标题】:Check if table exist using PDO使用 PDO 检查表是否存在
【发布时间】:2013-04-23 21:33:55
【问题描述】:

大家好,决定开始学习 PDO。但是我无法创建一个函数来检查我的数据库中是否存在一个表。

每个单独的项目都有自己的表,其中表名为 ($id)。

<?php
include_once('config.php');
include_once('simple_html_dom.php');

$html = file_get_html('http://localhost:8888/CDOnline%20Online.html');

foreach($html->find('div.product-stamp-inner') as $content) {   

$detail['itemid'] = $content->find('a',0)->href;
$detail['itemid'] = substr($detail['itemid'], 40, 6);
if (strpos($detail['itemid'], "?") !== false) {
$detail['itemid'] = substr($detail['itemid'], 0, 5);
}
$id = $detail['itemid'];

tableExists($dbh, $id);
}

function tableExists($dbh, $id)
{
//check if table exists
}

$dbh = null;
?>

我试图搜索论坛寻找答案,但空手而归。唯一让我接近答案的是:

function tableExists($dbh, $id)
{
$results = $dbh->query("SHOW TABLE LIKE `$id`");
if(count($results)>0){echo 'table exists';}
}

但这只是说所有表都存在,而一半的表不存在。

编辑:如果有 1 行或更多行,则该表应该存在。

【问题讨论】:

  • 通过创建同一张表的n 副本,您只会让您的生活更加困难。您需要有一个带有item_id 列的一个 表。说真的。

标签: php mysql pdo


【解决方案1】:

您在$id 周围使用反引号。将其更改为单引号。像这样:

"SHOW TABLES LIKE '$id'"

进一步注意,count($results)&gt;0 语句将不起作用。您必须改用$results-&gt;rowCount()


修复这两个错误将为您提供以下功能:

function tableExists($dbh, $id)
{
    $results = $dbh->query("SHOW TABLES LIKE '$id'");
    if(!$results) {
        die(print_r($dbh->errorInfo(), TRUE));
    }
    if($results->rowCount()>0){echo 'table exists';}
}

【讨论】:

  • 注意,统计查询结果并不会统计返回的行数。您可能想使用$results-&gt;rowCount
  • 您可以启用ini_set('display_errors', 1); 进行测试吗?你看到错误了吗?
  • 查询好像有错误。添加了错误检查代码。您能否再试一次该更新并告诉我您收到什么错误消息?
  • 感谢您的帮助。致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 /bsx/bsx offline/grabber.php:52 中的“LIKE '755823'' at line 1' 附近使用正确的语法:52 堆栈跟踪:#0 /bsx offline/grabber。 php(52): PDO->query('SHOW TABLE LIKE...') #1 /bsx offline/grabber.php(45): tableExists(Object(PDO), '755823') #2 {main} 抛出/bsx 离线/grabber.php 在第 52 行
  • SHOW TABLE 不应该是 SHOW TABLES
【解决方案2】:

SHOW TABLES...MySQL 方言,在几乎任何其他数据库引擎下都会失败。这当然不是便携式桌子检测的最终答案。

你能得到的最接近便携的方法是检查SELECT * FROM $table是否产生错误, 或讨论的类似方法here

如果您的需要只是创建一个不存在的表,您可以使用:

CREATE TABLE IF NOT EXISTS $table ($field, ...)

如果您的数据库位于 Windows MySQL 服务器上,您可能希望以小写来命名您的表以解决this bug

【讨论】:

    【解决方案3】:

    如果有人来寻找此问题,则会发布此信息。尽管已经回答了一点。

    if ($con->query(
                       "SHOW TABLES LIKE '" . $table . "'"
                   )->rowCount() > 0
            or die("No table set")
       ){
    

    有了这个,我只是将 else 条件推入 or。为了我的需要,我只需要死。虽然你可以设置或其他的东西。有些人可能更喜欢 if / else if / else。然后删除 or 然后提供 if / else if / else。

    或者如果我要重做这个功能:

    function tableExists($dbh, $id){
    
        if ($dbh->query(
                       "SHOW TABLES LIKE '" . $id . "'"
                   )->rowCount() > 0
            or die(print_r($dbh->errorInfo(), TRUE))
       ){
        echo 'table exists';
        }
    
    }
    

    没有测试重做,虽然它应该和我之前使用的代码一样工作。功能齐全。

    【讨论】:

      【解决方案4】:

      这似乎是最简单的方法。你向这个函数传递一个包含你已经创建的 pdo 对象的数组。

      $db['pdo']=new PDO('mysqlconnectiongoeshere');
      $db['table']='tabletobechecked';
      
      function is_table($db){
         $is_table=$db['pdo']->query("SHOW TABLES LIKE '".$db['table']."'");
         return$is_table->rowCount();
      }
      

      这样,如果表存在这个函数返回一个'1',如果它不存在这个函数返回一个'0';

      所以你可以这样使用它:

      if(is_table($db)){
        echo"The table".$db['table']." exists.";
      }else{
        echo"The table".$db['table']." does not exist.";
      }
      

      【讨论】:

        【解决方案5】:
        private function doesTableExist($table)
        {
            try {
                $this->db->query("DESC $table");
            } catch (Exception $e) {
                 return false;
            }
            return true;
        }
        

        【讨论】:

          【解决方案6】:

          只需使用良好的旧行数。表存在一定有结果。

          $sql ="SELECT count(*) FROM [table name]";
          $sql_result = $this->db_mssql->prepare($sql);
          $sql_result->execute();
          $sql_result->setFetchMode(PDO::FETCH_ASSOC);
          $my_res = $sql_result->fetchAll();
          if($my_res){
             echo 'table exists';
          }
          

          【讨论】:

            猜你喜欢
            • 2010-12-15
            • 2012-08-19
            • 1970-01-01
            • 2012-08-12
            • 1970-01-01
            • 1970-01-01
            • 2016-01-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多