Mysql
mySQL 拋出錯誤,但如果從錯誤消息或 die() 複製到 phpmyadmin 中,它可以工作
我想讓一個腳本執行,如果不存在,它會在表中創建一個列。如果列不存在,我正在使用來自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 中呼叫它。