মাইএসকিউএল চেক করুন কোনও টেবিল ব্যতিক্রম ছাড়াই উপস্থিত রয়েছে কিনা check


123

কোনও ব্যতিক্রম ছাড়াই মাইএসকিউএলে (পছন্দসই পিএইচপি-তে PDO এর মাধ্যমে) কোনও টেবিল উপস্থিত রয়েছে কিনা তা যাচাই করার সর্বোত্তম উপায়। "শো টেবিলে লাইক করুন" এর ফলাফল পার্স করার মতো মনে হয় না। বুলিয়ান কোয়েরি অবশ্যই আছে?

উত্তর:


199

আমি এর জন্য পিডিও বাক্য গঠন জানি না, তবে এটি বেশ সোজা-এগিয়ে বলে মনে হচ্ছে:

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

ধন্যবাদ, সম্পূর্ণরূপে ভুলে গেছি যে শো টেবিলগুলি কেবল একটি সঠিক টেবিলের মধ্যেই সীমাবদ্ধ থাকতে পারে
ক্লকস

53
PDO: $ tableExists = $ db-> ক্যোয়ারী ("টেবিলগুলি 'মাই টেবিলের মতো দেখান") -> সারি অ্যাকাউন্ট ()> 0;
27:32

4
mysqli: if (b db-> কোয়েরি ("টেবিলগুলি 'মাই টেবিলের মতো দেখান")) -> নাম_রোজ == 0) {// টেবিল তৈরি করুন}
zPuls3

1
@ ম্যাথিউফোস্কারিণী, রো-কাউন্ট () এই ক্ষেত্রে নির্ভরযোগ্য নাও হতে পারে, পিএইচপি ডক দেখুন
datasn.io

4
ফাংশনগুলির জন্য আর কোনও সমর্থন নেইmysql_* , সেগুলি আনুষ্ঠানিকভাবে হ্রাস করা হয় , আর রক্ষণাবেক্ষণ করা হয় না এবং ভবিষ্যতে সরানো হবে । ভবিষ্যতে আপনার প্রকল্পের কার্যকারিতা নিশ্চিত করার জন্য আপনার পিডিও বা মাইএসকিউএলির সাথে আপনার কোডটি আপডেট করা উচিত ।
ট্রিগ

39

আপনি যদি মাইএসকিউএল 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
@ নিকফ এটি আনসি স্ট্যান্ডার্ডের অংশ, তাই এটি বিভিন্ন rdbms'es এর মধ্যে বহনযোগ্য।
Troelskn

@ নিকফ: এটি মাইএসকিউএল ব্যতীত অন্যান্য ডাটাবেসেও কাজ করে। এর মধ্যে পোস্টগ্র্রেএসকিউএল এবং এসকিউএল সার্ভার রয়েছে যতদূর আমি বলতে পারি।
পাওয়ারলর্ড

ভাবছেন যে এটি কোনও সুরক্ষা
শোষক কিনা

3
কোনও সুরক্ষা ঝুঁকি নেই - তথ্য_সেমিটা ডাটাবেসের প্রশ্নগুলি সংযুক্ত ব্যবহারকারীর সুবিধাগুলি কেবল সারণীগুলি দেখায়।
ওয়ারেন রুমাক

8

Mysqli ব্যবহার করে আমি নিম্নলিখিত ফাংশন তৈরি করেছি। ধরে নেওয়া আপনার একটি কনস নামে পরিচিত একটি mysqli উদাহরণ রয়েছে।

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 দ্বারা সুরক্ষিত হিসাবে এই ফাংশনটি স্ক্লিনেকশন অ্যাটাকের পক্ষে ঝুঁকিপূর্ণ হতে পারে, তাই নিশ্চিত করুন যে আপনার $tableভার পরিষ্কার আছে বা আরও ভাল প্যারামিটারাইজড কোয়েরি ব্যবহার করুন।


কেবলমাত্র যদি আপনি কাউকে $ টেবিলের ভেরিটি পূরণ করতে দেন তবে কোনও বর্গ স্ট্যাটমেন্টের ভিতরে থাকা প্রতিটি ভেরি বিপজ্জনক নয়, কেবলমাত্র যদি আপনি অবিশ্বস্ত উত্স থেকে ডেটা পান। অবশ্যই আপনি কীভাবে ফাংশনটি ব্যবহার করেন এবং ফিল্টারিং করেন তার জন্য আপনি দায়বদ্ধ। এই উত্তরটি হ্রাস করার দরকার নেই।
ফাল্ক

আপনি যদি এই জাতীয় কোড প্রকাশ করেন তবে কেউ এটিকে এমন জায়গায় ব্যবহার করবেন যেখানে ডেটা সঠিকভাবে পরীক্ষা করা হয়নি এবং এটি এসকিউএল ইঞ্জেকশন দিয়ে শেষ হবে। কেবলমাত্র প্যারামিটারাইজড অনুরোধগুলি ব্যবহার করুন এবং ডেটা পরীক্ষা করা হয়েছে কিনা তা আপনি কোনও সমস্যা এড়াতে পারবেন। এখানে এটি না করার কোনও কারণ নেই, এটি কেবল খারাপ অভ্যাস।
jcaron

কীভাবে একটি আসল_স্কেপ_ স্ট্রিং যুক্ত করবেন?
ফাল্ক

প্যারামিটারাইজড ক্যোয়ারী ব্যবহার করুন এবং ভৌতিক গল্পগুলি এড়ান।
jcaron

4

কেউ যদি এই প্রশ্নের সন্ধান করে আসে তবে এটি পোস্ট করা হয়। যদিও এর কিছুটা উত্তর দেওয়া হয়েছে। কিছু উত্তর এটির প্রয়োজনের চেয়ে জটিল করে তুলেছে।

মাইএসকিএল * এর জন্য আমি ব্যবহার করেছি:

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

সঞ্চিত প্রক্রিয়াগুলি ব্যবহার করার সময় আমার সমাধানটি এখানে আমি পছন্দ করি। সারণীটি পরীক্ষা করার জন্য কাস্টম মাইএসকিএল ফাংশন বর্তমান ডাটাবেসে বিদ্যমান।

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" ব্যবহার করার পরামর্শ দিচ্ছি এবং ফলস্বরূপ আপনি সত্য / মিথ্যা পেয়েছেন কিনা তা পরীক্ষা করে দেখুন recommend

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

আমি যা পড়েছি তা থেকে 'শো' অকার্যকর হয়ে ওঠে তবে 'তথ্য_সেমিমা' 'ডেসক্রিবি'-র চেয়ে বেশি পছন্দ করা হয়।
এসোটেরিকা

-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' পদ্ধতিটি ব্যবহার করেছি। এখানে আরও তথ্য: মাইএসকিউএল "উপস্থিত না থাকলে টেবিল তৈরি করুন" -> ত্রুটি 1050


-9

আপনি বুঝতে এত কঠিন করে কেন?

function table_exist($table){ 
    $pTableExist = mysql_query("show tables like '".$table."'");
    if ($rTableExist = mysql_fetch_array($pTableExist)) {
        return "Yes";
    }else{
        return "No";
    }
} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.