2012-09-05 66 views
3

這裏是我到目前爲止有:我可以使用PDO運行多個SQL查詢並檢索每個語句的受影響行數嗎?

/** 
* @param PDO $db 
* @param string $file 
*/ 
function run_sql_file($db, $file) { 
    $sql = file_get_contents($file); 
    try { 
     $affected = $db->exec($sql); 
     println("$affected row(s) affected"); 
    } catch(PDOException $e) { 
     exitmsg($e->getMessage()); 
    } 
} 

它似乎運行所有的查詢,但它總是讓我背「受影響的0行」。有沒有辦法獲取每個語句的受影響行數?最好連同關聯的查詢,以及任何錯誤消息和警告。

+0

'exec'不會返回受SELECT影響的行數 - 您傳入了哪些語句? – andrewsi

+0

@andrewsi:插入,刪除和截斷。 「0」或其他什麼都可以。 – mpen

回答

0

嘗試在執行後設置計數變量:

$ db-> exec($ sql);

$ affected = $ db-> rowCount();

+0

我敢打賭,這將返回第一條或最後一條語句的計數,而不是所有語句的總數。 PDO似乎並沒有正式支持多條語句。如果你切換到mysqli,你可以使用'mysqli_multi_query'。 – Barmar

+0

@Barmar:我正在使用'mysqli',但我不喜歡它綁定params和東西的方式。 – mpen

+1

那麼,生活是一系列的折衷。 mysqli有多個查詢,PDO具有更好的綁定。 – Barmar

-1

讓你沒有任何瘋狂的SQL,將炸掉爆炸聲明的假設......

/** 
* @param PDO $db 
* @param string $file 
*/ 
function run_sql_file($db, $file) { 
    $sql = file_get_contents($file); 
    $sql_lines = explode(';',$sql); 
    try { 
     foreach($sql_lines as $line) { 
      $affected += $db->exec($line); 
     } 
     println("$affected row(s) affected"); 
    } catch(PDOException $e) { 
     exitmsg($e->getMessage()); 
    } 
} 
+4

是啊......我不喜歡這個假設;)分號在字符串中是完全合法的。 – mpen

+2

這是瘋狂的,字符串可能包含大量的分號 – jondinham

+0

這可能是危險的。分裂';'可能會破壞SQL查詢中的數據 –

3

我遇到了同樣的問題,比如我讀了一系列的MySQL刪除表的從文件sql語句,我想他們執行到單個PDO-> EXEC():

$dbh = new PDO('mysql:host=test;dbname=db1', 'user', 'pass'); 
    try { 

    $dbh->exec('drop table test_table1;drop table test_table2;'); 
    } 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
    die(); 
} 

如果先降SQL是成功,那麼,如果第二個失敗也不例外甚至惜售(即表名沒有按不存在了)。似乎沒有辦法可以檢查所有的sqls是否被執行或僅在第一次失敗時執行PDO_MYSQLND;,那麼PDO異常提升。

相關問題