2014-10-01 50 views
2

我試圖插入信息到一個表中,並在一個字符串中更新另一個表(在同一個數據庫中)的兩行。我的印象是,你可以簡單地通過在每次嘗試後添加一個分號來做到這一點,它會在同一個字符串內單獨執行。多個MySql插入和更新未按預期方式運行

我想不出任何其他方式來實現在'遊戲'表中插入數據並同時更新'players'表中兩個唯一行中的數據的預期效果。

這裏是我的代碼...

<?php 

include_once('database-details.php'); 

$winner   = mysqli_real_escape_string($db, $_REQUEST['winner']); 
$loser    = mysqli_real_escape_string($db, $_REQUEST['loser']); 
$balled   = mysqli_real_escape_string($db, $_REQUEST['balled']); 
$fixtures   = 'games'; 
$table    = 'players'; 

$sql = "INSERT INTO `$fixtures` " 
    . "(`id`, `winner`, `loser`, `balled`) VALUES " 
    . "(NULL, '$winner', '$loser', '$balled') ;" 
    . "UPDATE `$table` SET apps = apps + 1, wins = wins + 1, balled = balled + $balled WHERE id = $winner ;" 
    . "UPDATE `$table` SET apps = apps + 1, losses = losses + 1, balled = balled - $balled WHERE id = $loser"; 

if(!$result = $db->query($sql)){ 
    die('There was an error running the query [' . $db->error . ']'); 
} 

$response = (object)array('status' => 'error'); 

if($result){ 
    $response = (object)array(
     'status' => 'ok', 
     'id'  => $db->insert_id, 
    ); 
} 

header('Content-type: application/json'); 
echo json_encode($response); 

?> 

腳註... 形式與AJAX提交更新,然後在前端的內容。我可以確認提交工作正常,只有一個要求我已經測試了所有三個個人提交,並且工作正常。它只有當我結合他們時纔會被打破。

非常感謝您的幫助。

+0

從這裏閱讀:http://php.net/manual/en/mysqli.quickstart.multiple-statement.php它似乎應該使用mysqli_multi_query() – 2014-10-01 00:23:30

+0

只是嘗試過你提供的鏈接,它似乎已經做到了!感謝您的提供。 – 2014-10-01 00:33:53

回答

0

你有沒有做更新查詢在相同的查詢?

而且具有

$response = (object)array('status' => 'error'); 

if($result){ 

因爲你已經停止腳本執行就行了上述

if(!$result = $db->query($sql)){ 

也許嘗試是沒有意義的:

<?php 

include_once('database-details.php'); 

$winner   = mysqli_real_escape_string($db, $_REQUEST['winner']); 
$loser    = mysqli_real_escape_string($db, $_REQUEST['loser']); 
$balled   = mysqli_real_escape_string($db, $_REQUEST['balled']); 
$fixtures   = 'games'; 
$table    = 'players'; 

$sql = "INSERT INTO `$fixtures` " 
    . "(`id`, `winner`, `loser`, `balled`) VALUES " 
    . "(NULL, '$winner', '$loser', '$balled') ;" 

if(!$result = $db->query($sql)){ 
    die('There was an error running the query [' . $db->error . ']'); 
else{ 
    $insertid = $db->insert_id 
    $sql = "UPDATE `$table` SET apps = apps + 1, wins = wins + 1, balled = balled + $balled WHERE id = $winner ;" 
    if(!$result = $db->query($sql)){ 
     die('There was an error running the query [' . $db->error . ']'); 
    } 
    $sql = "UPDATE `$table` SET apps = apps + 1, losses = losses + 1, balled = balled - $balled WHERE id = $loser"; 
    if(!$result = $db->query($sql)){ 
     die('There was an error running the query [' . $db->error . ']'); 
    } 
    $response = (object)array(
     'status' => 'ok', 
     'id'  => $insertid , 
    ); 
} 

header('Content-type: application/json'); 
echo json_encode($response); 

?> 

根據您的$ DB類的insert_id的值可能不是您所期望的,如果您在其中運行多個sql語句查詢。

0

它看起來像一個併發問題。您可能希望使用將自動提交轉爲關閉狀態,並使用mysqli_begin_transaction()設置塊,執行查詢並使用mysqli_commit()來處理該塊。

喜歡的東西:

mysqli_autocommit($db, FALSE); 
    mysqli_begin_transaction(); 
    //now call query() as many times as needed 
    mysqli_commit(); 
0

謝謝大家的快速回復。最後,爲mysqli_multi_query()提供的鏈接@AR有訣竅。以下是它現在的樣子(如果有人對此感興趣)...

<?php 

include_once('database-details.php'); 

$winner = mysqli_real_escape_string($db, $_REQUEST['winner']); 
$loser  = mysqli_real_escape_string($db, $_REQUEST['loser']); 
$balled = mysqli_real_escape_string($db, $_REQUEST['balled']); 
$fixtures = 'games'; 
$table  = 'players'; 

$sql = "INSERT INTO `$fixtures` " 
    . "(`id`, `winner`, `loser`, `balled`) VALUES " 
    . "(NULL, '$winner', '$loser', '$balled') ;" 
    . "UPDATE `$table` SET apps = apps + 1, wins = wins + 1, balled = balled + $balled WHERE id = $winner ;" 
    . "UPDATE `$table` SET apps = apps + 1, losses = losses + 1, balled = balled + $balled WHERE id = $loser"; 

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

do { 
    if ($result = $db->store_result()) { 
     $response = (object)array(
      'status' => 'ok' 
     ); 
     $result->free(); 
    } 
} while ($db->more_results() && $db->next_result()); 

header('Content-type: application/json'); 
echo json_encode($response); 

?>  

PS - 感謝@Hadyn Dickson對查詢的建議。