एक अपवाद को फेंकने के बिना एक तालिका मौजूद है, तो MySQL की जाँच करें


123

यह जांचने का सबसे अच्छा तरीका है कि क्या अपवाद के बिना MySQL (अधिमानतः PHP में पीडीओ के माध्यम से) में एक तालिका मौजूद है। मुझे "SHOW TABLES LIKE" et cetera के परिणामों को पार्स करने का मन नहीं है। बूलियन क्वेरी के कुछ प्रकार होने चाहिए?

जवाबों:


199

मैं इसके लिए PDO सिंटैक्स नहीं जानता, लेकिन यह बहुत सीधा-सीधा लगता है:

$result = mysql_query("SHOW TABLES LIKE 'myTable'");
$tableExists = mysql_num_rows($result) > 0;

धन्यवाद, यह पूरी तरह से भूल गया कि शो
ट्यूब लाइक

53
PDO: $ tableExists = $ db-> query ("SHOW TABLES LIKE 'myTable'") -> rowCount ()> 0;
रिएक्टगुलर

4
mysqli: if ($ db-> query ("SHOW TABLES LIKE 'myTable'") -> num_rows == 0) {// create table}
zPuls3

1
@MathewFoscarini, rowCount () इस मामले में विश्वसनीय नहीं हो सकता है, PHP डॉक देखें ।
datasn.io

4
नहीं है कोई और अधिक समर्थन के लिए mysql_*काम करता है, वे कर रहे हैं आधिकारिक तौर पर पदावनत , अब और नहीं बनाए रखा जाएगा और हटाया भविष्य में। भविष्य में अपने प्रोजेक्ट की कार्यक्षमता सुनिश्चित करने के लिए आपको अपने कोड को PDO या MySQLi से अपडेट करना चाहिए ।
TRIG

39

यदि आप MySQL 5.0 और बाद में उपयोग कर रहे हैं, तो आप कोशिश कर सकते हैं:

SELECT COUNT(*)
FROM information_schema.tables 
WHERE table_schema = '[database name]' 
AND table_name = '[table name]';

किसी भी परिणाम का संकेत तालिका मौजूद है।

से: http://www.electrictoolbox.com/check-if-mysql-table-exists/


शायद मुझे कुछ याद आ रहा है, लेकिन आप इस विधि का उपयोग कम से कम क्यों करेंगे?
14

1
@nickf यह एएनआई मानक का हिस्सा है, इसलिए यह विभिन्न rdbms'es के बीच पोर्टेबल है।
ट्रोल्सकॉन

@nickf: यह MySQL के अलावा अन्य डेटाबेस पर भी काम करता है। इसमें PostgreSQL और SQL सर्वर शामिल हैं जहां तक ​​मैं बता सकता हूं।
पॉवरलॉर्ड

सोच रहा था कि यह एक सुरक्षा शोषण है जो आप डेटाबेस से जुड़ी जानकारी को क्वेरी नहीं कर सकते हैं ...
Talvi Watia

3
कोई सुरक्षा जोखिम नहीं है - सूचना_केम डेटाबेस पर क्वेरी केवल उन तालिकाओं को दिखाएगी जिनसे कनेक्ट किए गए उपयोगकर्ता को विशेषाधिकार हैं।
वारेन रमक

8

Mysqli का उपयोग करके मैंने निम्नलिखित फ़ंक्शन बनाया है। मान लें कि आपके पास mysqli का उदाहरण है जिसे $ con कहा जाता है।

function table_exist($table){
    global $con;
    $table = $con->real_escape_string($table);
    $sql = "show tables like '".$table."'";
    $res = $con->query($sql);
    return ($res->num_rows > 0);
}

आशा करता हूँ की ये काम करेगा।

चेतावनी: @jcaron द्वारा आत्महत्या के रूप में यह फ़ंक्शन sqlinjection अटैक के लिए असुरक्षित हो सकता है, इसलिए सुनिश्चित करें कि आपका संस्करण $tableसाफ है या बेहतर उपयोग किए गए पैरामीटर भी हैं।


केवल अगर आप किसी को $ टेबल संस्करण भरने देते हैं, तो एक वर्ग सांख्यिकीय के अंदर हर संस्करण खतरनाक नहीं है, केवल तभी जब आप अविश्वसनीय स्रोतों से डेटा प्राप्त करें। बेशक आप जिम्मेदार हैं कि आप फ़ंक्शन का उपयोग कैसे करते हैं और फ़िल्टरिंग करते हैं। इस उत्तर को अस्वीकार करने की कोई आवश्यकता नहीं है।
फॉक

यदि आप इस तरह कोड प्रकाशित करते हैं, तो कोई इसे उस स्थान पर उपयोग करना समाप्त कर देगा जहां डेटा की ठीक से जाँच नहीं की गई है, और SQL इंजेक्शन के साथ समाप्त हो जाएगा। बस पैरामीटर अनुरोधों का उपयोग करें, और आप किसी भी मुद्दे से बचेंगे, चाहे डेटा की जाँच की गई हो या नहीं। यहाँ ऐसा नहीं करने का कोई कारण नहीं है, यह सिर्फ बुरा व्यवहार है।
जकार्टन

एक real_escape_string जोड़ने के बारे में कैसे?
फॉक

पैरामीटर प्रश्नों का उपयोग करें और डरावनी कहानियों से बचें।
जकार्न २on

4

यह किसी को भी इस सवाल की तलाश में आता है, तो बस पोस्ट किया जाता है। भले ही इसका जवाब थोड़ा सा दिया गया है। कुछ उत्तर इसकी आवश्यकता से अधिक जटिल बनाते हैं।

Mysql के लिए * मैंने इस्तेमाल किया:

if (mysqli_num_rows(
    mysqli_query(
                    $con,"SHOW TABLES LIKE '" . $table . "'")
                ) > 0
        or die ("No table set")
    ){

पीडीओ में मैंने इस्तेमाल किया:

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

इस के साथ मैं या तो में शर्त धक्का या। और मेरी जरूरतों के लिए मुझे केवल मरने की जरूरत है। हालांकि आप सेट या अन्य चीजों के लिए कर सकते हैं। कुछ इफ / इफ इफ इफ़ेक्ट / वरना पसंद कर सकते हैं। जिसे तब हटा देना है या फिर आपूर्ति करना है यदि / और यदि / तो।


3

यहां मेरा समाधान है जिसे मैं संग्रहीत प्रक्रियाओं का उपयोग करते समय पसंद करता हूं। वर्तमान डेटाबेस में तालिका की जाँच के लिए कस्टम mysql फ़ंक्शन मौजूद है।

delimiter $$

CREATE FUNCTION TABLE_EXISTS(_table_name VARCHAR(45))
RETURNS BOOLEAN
DETERMINISTIC READS SQL DATA
BEGIN
    DECLARE _exists  TINYINT(1) DEFAULT 0;

    SELECT COUNT(*) INTO _exists
    FROM information_schema.tables 
    WHERE table_schema =  DATABASE()
    AND table_name =  _table_name;

    RETURN _exists;

END$$

SELECT TABLE_EXISTS('you_table_name') as _exists

2

बड़े डेटाबेस पर "शो टेबल" धीमी हो सकती है, मैं "DESCRIBE" का उपयोग करने की सलाह देता हूं और परिणाम के रूप में सही / गलत होने पर जांच करता हूं

$tableExists = mysqli_query("DESCRIBE `myTable`");

मैंने जो पढ़ा अगर 'SHOW' अक्षम हो जाता है तो 'DESCRIBE' पर 'information_schema' को अधिक पसंद किया जाता है।
एसोटेरिका

-1
$q = "SHOW TABLES";
$res = mysql_query($q, $con);
if ($res)
while ( $row = mysql_fetch_array($res, MYSQL_ASSOC) )
{
    foreach( $row as $key => $value )
    {
        if ( $value = BTABLE )  // BTABLE IS A DEFINED NAME OF TABLE
            echo "exist";
        else
            echo "not exist";
    }
}

2
उत्तर की सर्वोत्तम गुणवत्ता प्रदान करने के लिए कृपया कोड के लिए सटीक टिप्पणी जोड़ें। बस पेस्ट करें कुछ कोड प्रश्न के लेखक को ज्यादा नहीं बताता है।
जकूब माटिसक

5
यह वास्तव में भयानक है। तो अगर वहाँ 50,000 टेबल हैं, तो आप सभी टेबल को लोड करेंगे, हर एक के माध्यम से लूप पाएंगे कि क्या सही टेबल मौजूद है?
रोहित चोपड़ा

-1

ज़ेंड फ्रेमवर्क

public function verifyTablesExists($tablesName)
    {
        $db = $this->getDefaultAdapter();
        $config_db = $db->getConfig();

        $sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{$config_db['dbname']}'  AND table_name = '{$tablesName}'";

        $result = $db->fetchRow($sql);
        return $result;

    }

-1

यदि ऐसा करने की इच्छा सशर्त तालिका निर्माण की है, तो 'सृजन कार्य यदि आवश्यक नहीं है' नौकरी के लिए आदर्श लगता है। जब तक मुझे यह पता नहीं चला, मैंने ऊपर 'DESCRIBE' पद्धति का उपयोग किया। यहाँ अधिक जानकारी: MySQL "सृजन नहीं तो मुश्किल है" -> 1050 त्रुटि


-9

आप इसे समझना इतना कठिन क्यों बनाते हैं?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.