2014-10-01 47 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对查询的建议。