Mysql

mySQL 拋出錯誤,但如果從錯誤消息或 die() 複製到 phpmyadmin 中,它可以工作

  • January 10, 2017

我想讓一個腳本執行,如果不存在,它會在表中創建一個列。如果列不存在,我正在使用來自mysql ALTER TABLE的使用者 abahet 的腳本

我的 php 程式碼(在 db 類內部)如下所示:

$sql = '
   SET @preparedStatement = (SELECT IF(
       (SELECT COUNT(*)
               FROM INFORMATION_SCHEMA.COLUMNS
              WHERE table_name = "' . $this->t($table) . '"
                AND table_schema = DATABASE()
                AND column_name = "' . $column . '"
       ) > 0,
       "SELECT 1;",
       "ALTER TABLE ' . $this->t($table) . ' ADD ' . $column . ' ' . $params . ';"
   ));

   PREPARE alterIfNotExists FROM @preparedStatement;
   EXECUTE alterIfNotExists;
   DEALLOCATE PREPARE alterIfNotExists;
';
//die($sql);
$this->db($sql,'utf8');

一旦執行,它會拋出以下錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PREPARE alterIfNotExists FROM @preparedStatement;
           EXECUTE alterIfNotExists;
   ' at line 12

           SET @preparedStatement = (SELECT IF(
               (SELECT COUNT(*)
                       FROM INFORMATION_SCHEMA.COLUMNS
                      WHERE table_name = "ddpos_2_user"
                        AND table_schema = DATABASE()
                        AND column_name = "id_signature"
               ) > 0,
               "SELECT 1;",
               "ALTER TABLE ddpos_2_user ADD id_signature mediumint(7) DEFAULT 0;"
           ));

           PREPARE alterIfNotExists FROM @preparedStatement;
           EXECUTE alterIfNotExists;
           DEALLOCATE PREPARE alterIfNotExists;

但是,當我將錯誤消息中的查詢複製到 phpmyadmin 中,或者直接從die($sql)phpmyadmin 中獲取輸出時,該過程可以正常工作而沒有錯誤,並且該列id_signature已創建。

為什麼?

看起來您在一個字元串中執行多行 SQL 時遇到了問題。你需要找出可以處理執行多行的 PHP 類。

與其讓 SQL 執行動態 SQL,不如自己執行

$sql = 'SELECT IF(
   (SELECT COUNT(*)
           FROM INFORMATION_SCHEMA.COLUMNS
          WHERE table_name = "' . $this->t($table) . '"
            AND table_schema = DATABASE()
            AND column_name = "' . $column . '"
   ) > 0,
   "SELECT 1;",
   "ALTER TABLE ' . $this->t($table) . ' ADD ' . $column . ' ' . $params . ';")';

執行這一行,獲取結果字元串,然後執行它。

嘿,這可能意味著執行兩個 SQL 命令,但它會起作用。

另一種方法是使用該程式碼編寫一個儲存過程,然後呼叫該儲存過程。

請看我對MySQL: Create index If not exists的回答,如果索引不存在,我使用動態 SQL 創建索引。您可以為自己建構一個儲存過程並從 PHP 中呼叫它。

引用自:https://dba.stackexchange.com/questions/160476