2

大家好决定开始学习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 行或更多行,该表应该存在。

4

6 回答 6

14

您正在使用 backtics $id。将其更改为单引号。像这样:

"SHOW TABLES LIKE '$id'"

进一步注意,该语句count($results)>0将不起作用。你必须$results->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';}
}
于 2013-04-23T21:36:42.273 回答
2

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

您可以获得的最接近便携式的方法是检查是否SELECT * FROM $table产生错误,或此处讨论的类似方法

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

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

但是,如果您的数据库位于 Windows MySQL 服务器上,您可能希望将表命名为小写以解决此错误。

于 2013-12-27T02:56:48.580 回答
1

如果有人来寻找这个问题,就会简单地发布这个。即使它被回答了一点。

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

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

}

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

于 2013-11-19T17:13:55.950 回答
0

这似乎是最简单的方法。你向这个函数传递一个带有你已经创建的 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.";
}
于 2016-09-08T10:01:15.970 回答
-1
private function doesTableExist($table)
{
    try {
        $this->db->query("DESC $table");
    } catch (Exception $e) {
         return false;
    }
    return true;
}
于 2016-03-30T10:34:58.277 回答
-1

只需使用良好的旧行数。如果表存在,则必须有结果。

$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';
}
于 2020-05-05T12:05:50.043 回答