2015-02-08 108 views
2

我正在使用Mysqli和multi_query在數據庫表中更新或插入多行。當我在本地MAMP服務器上使用它們時它們工作正常,但當我將它們聯機時它們會中斷。在遠程服務器上,只執行四個查詢中的三個...Mysqli multi_query不執行所有查詢

這兩種環境都具有PHP和MySQL版本5+,並且包含「PHP擴展名:mysqli」。我看到的唯一區別是phpMyAdmin版本。遠程服務器有3.5.6,我的本地MAMP服務器有4.2.5。這會有影響嗎?

我當然在改變密碼,所有的變量應該是有效的,因爲他們在本地工作。

我不知所措...謝謝!

$mysqli = new mysqli("localhost", "root", "root", "database"); 
if ($mysqli->connect_errno) { 
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 
$sql = "INSERT INTO categories (id, name, descr) VALUES ('$id1', '$name1', '$descr1') ON DUPLICATE KEY UPDATE name='$name1', descr='$descr1';"; 
$sql.= "INSERT INTO categories (id, name, descr) VALUES ('$id2', '$name2', '$descr2') ON DUPLICATE KEY UPDATE name='$name2', descr='$descr2';"; 
$sql.= "INSERT INTO categories (id, name, descr) VALUES ('$id3', '$name3', '$descr3') ON DUPLICATE KEY UPDATE name='$name3', descr='$descr3';"; 
$sql.= "INSERT INTO categories (id, name, descr) VALUES ('$id4', '$name4', '$descr4') ON DUPLICATE KEY UPDATE name='$name4', descr='$descr4';"; 

if (!$mysqli->multi_query($sql)) { 
    echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error; 
}else{ 
    echo("Succes."); 
} 
$mysqli->close() 

UPDATE: 使用單個查詢更換查詢的工作,但不是很做,能夠在所有情況下,需要大量重寫的...使用硬編碼的變量沒有幫助。

$sql2 = "INSERT INTO categories (id, name, descr) VALUES ('$id1', '$name1', '$descr1'), ('$id2', '$name2', '$descr2'), ('$id3', '$name3', '$descr3'),('$id4', '$name4', '$descr4') 
    ON DUPLICATE KEY UPDATE name=VALUES(name), descr=VALUES(descr)"; 
+0

@ Fred-ii-這可能是問題嗎?這些相同的語句在本地工作...... – Jorgos 2015-02-08 22:12:58

+1

'phpMyAdmin'只是'基於Web的MySQL管理工具',它既不是必需的,也不影響'mysql'或'php'的功能。 – 2015-02-08 22:13:00

+0

@Jorgos我刪除了我的評論。這是有效的。我認爲SET是需要的,但看了手冊後,兩種方法都是有效的http://dev.mysql.com/doc/refman/5.6/en/insert.html – 2015-02-08 22:13:47

回答

2

通過使用如圖所示php.net的「面向對象式」固定的問題。仍然不確定爲什麼我以前的方法只能在本地工作,但沒關係,我們稱之爲固定。

/* execute multi query */ 
if ($mysqli->multi_query($query)) { 
do { 
    /* store first result set */ 
    if ($result = $mysqli->store_result()) { 
     while ($row = $result->fetch_row()) { 
      printf("%s\n", $row[0]); 
     } 
     $result->free(); 
    } 
    /* print divider */ 
    if ($mysqli->more_results()) { 
     printf("-----------------\n"); 
    } 
} while ($mysqli->next_result()); 
} 

/* close connection */ 
$mysqli->close();