2013-04-23 162 views
0

大家好,都決定開始學習PDO。然而,我無法創建一個函數來檢查一個表是否存在於我的數據庫中。檢查表是否存在使用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';} 
} 

但是,這只是說所有表存在,當表的一半是不存在的。

編輯:如果有一個或多個行,該表應存在。

+5

通過創建你只是讓你的生活更加困難同桌的'N'副本。你需要有一個* item_id列的表。認真。 – 2013-04-23 21:41:30

回答

11

您正在使用$id附近的backtics。將其更改爲單引號。就像這樣:

"SHOW TABLES LIKE '$id'" 

進一步注意到,聲明count($results)>0將無法​​正常工作。您必須改用$results->rowCount()


Fxing兩個錯誤會給你以下功能:

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';} 
} 
+0

請注意,計數查詢結果不會計算返回的行數。你可能想使用'$ results-> rowCount'。 – showdev 2013-04-23 21:46:28

+0

@showdev。我監督了這個..對不起。給我分鐘... – hek2mgl 2013-04-23 21:55:42

+0

@DrDog。檢查我的更新。謝謝showdev – hek2mgl 2013-04-23 21:56:46

1

這簡直是貼如果有人來尋找這個問題。儘管它已被回答了一下。

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

有了這個,我只是將其他條件推入或。爲了我的需要,我只需要死。雖然你可以設置或其他的東西。有些人可能更喜歡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'; 
    } 

} 

沒有測試重做,但它應該工作一樣我以前使用的代碼。正在發揮作用。

2

SHOW TABLES...MySQL方言,並會在幾乎任何其他數據庫引擎下失敗。這當然不是便攜式表檢測的明確答案。

最接近的便攜式,你可以得到將是檢查SELECT * FROM $table是否會產生錯誤, 或類似的方法討論here

如果您需要的是簡單地創建一個表,如果它不存在,你可以使用:

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

你可能想名字小寫你的表來解決this bug如果您的數據庫位於Windows的MySQL服務器上,雖然。

-1
private function doesTableExist($table) 
{ 
    try { 
     $this->db->query("DESC $table"); 
    } catch (Exception $e) { 
     return false; 
    } 
    return true; 
} 
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."; 
}