2015-03-09 2 views
1

Мне кажется, проблема, когда я пытаюсь запустить запрос в запросе. Я использую php-скрипт, который сделает api-звонок для обновления данных отслеживания в ebay для продажи записей.Команда из Sync при запуске запроса внутри запроса с PHP

Способ, которым он работает, заключается в том, что он сначала делает выбор в таблице для любых записей, которые не были выполнены. Затем для первой записи он выполнит вызов api, а затем получит ответ в ответ. Если Ack имеет успех, он будет обновлять продажу как завершенную и вставить запись журнала. Если это сбой, он не будет обновлять запись и снова вставить запись журнала. Затем он перейдет к следующей записи и повторит одно и то же действие и т. Д. Для остальных продаж.

Теперь, когда я запускаю его, я получаю сообщение «Команды не синхронизированы, вы не можете запустить эту команду сейчас». Это происходит только во второй записи о продаже и в любой записи.

Я пытался закрыть соединение и free_result, но ничего не работает.

Я думал хранить все продажи в массиве, но я не хочу, если это разумно или возможно.

Я заметил, что у этого post было решение, но я не могу применить его к моему сценарию. Пожалуйста, любая помощь будет оценена!

Вот мой код:

<?php 
echo "Start update of sales"; 

//Database query for pending orders 
$servername = "localhost"; 
$username = "XXX"; 
$password = "XXXX"; 
$dbname = "XXXX"; 
$conn = mysqli_connect($servername, $username, $password, $dbname); 
//Check connection 
if (!$conn) { 
die("Connection failed: " . mysqli_connect_error()); 
} 
$query = "SELECT ss.`item_id`, ss.`transaction_id`, ss.`tracking_number` FROM `sales_table` ss WHERE ss.`completed`<> 1"; 
$result = mysqli_query($conn, $query) or die(mysql_error()); 
while($row = mysqli_fetch_array($result)){ 
echo $row['transaction_id']. " - ". $row['item_id']; 
echo "<br />"; 
$tranid = $row['transaction_id']; 
echo $tranid; 

///Build the request Xml string 
$requestXmlBody = '<?xml version="1.0" encoding="utf-8"?>'; 
$requestXmlBody .= '<CompleteSaleRequest xmlns="urn:ebay:apis:eBLBaseComponents">'; 
... 
$requestXmlBody .= '</CompleteSaleRequest>';  

//Create a new eBay session 
$session = new eBaySession($userToken, $devID, $appID, $certID, $serverUrl, $compatabilityLevel, $siteID, $verb); 
//send the request and get response 
$responseXml = $session->sendHttpRequest($requestXmlBody); 
//print $responseXml; 
PrintUtils::printXML($responseXml); 
$xml = simplexml_load_string($responseXml); 

foreach ($xml->Ack as $Ack) { 
     echo "Status: ".$Ack ."<br>"; 

     { $sql = "UPDATE `sales_table` SET `completed`=1, `completed_date`=now(), `update_date`=now() where `transaction_id`='$tranid' and `item_id`='$itemid';"; 
      $sql .= "INSERT INTO `sales_log` (`item_id`, `transaction_id`, `status`, `short_desc`, `long_desc`, `log_date`) VALUES ('$itemid', '$tranid', '$Ack', '$Ack', '$Ack', CURRENT_TIMESTAMP);"; 
    }} 

    if (mysqli_multi_query($conn, $sql)){ 

    echo "New record created successfully <br>"; 
     } else { 
      echo "Error inserting records. " . $sql ."<br>" . mysqli_error($conn); 
     }} 
mysqli_free_result($result);mysqli_close($conn);?> 

P.s Im PHP все еще учусь, так что любая помощь приветствуется.

+0

Это, кажется, жизнеспособный вариант, но я не могу найти какие-либо примеры prooer о том, как его применять. http://stackoverflow.com/questions/3632075/mysqli-giving-commands-out-of-sync-error-why – user3646925

ответ

0

Как это сделать?

$rows=array(); 
if($result=mysqli_query($conn,$query)){ 
    while(($rows[]=mysqli_fetch_assoc($result)) || array_pop($rows)); 
    mysqli_free_result($result); 
}else{ 
    die(mysqli_error($conn)); 
} 

foreach($rows as $row){ 
    $tranid=$row['transaction_id']; 
    echo $row['transaction_id']." - ".$row['item_id']."<br>"; 

    //Build the request Xml string 
    //Create a new eBay session 
    //send the request and get response 
    //print $responseXml; 

    $sql=array(); 
    foreach($xml->Ack as $Ack){ 
     echo "Status: ".$Ack."<br>"; 
     $sql["Update"]="UPDATE `sales_table` SET `completed`=1, `completed_date`=now(), `update_date`=now() where `transaction_id`='$tranid' and `item_id`='$itemid'"; 
     $sql["Insert"]="INSERT INTO `sales_log` (`item_id`, `transaction_id`, `status`, `short_desc`, `long_desc`, `log_date`) VALUES ('$itemid', '$tranid', '$Ack', '$Ack', '$Ack', CURRENT_TIMESTAMP)"; 
    } 

    if(mysqli_multi_query($conn,implode(';',$sql))){ 
     do{ 
      list($current_key,$current_query)=each($sql); //advances array pointer to first or next element 
      if(mysqli_affected_rows($conn)<1){ 
       echo "Query logic error @ $current_key where TranID=$tranid & Ack=$Ack<br>"; 
      }else{ 
       echo "New record created where TranID=$tranid & Ack=$Ack<br>"; 
      } 
     } while(mysqli_more_results($conn) && mysqli_next_result($conn)); 
    }else{ 
     list($current_key,$current_query)=each($sql); //advances array pointer to first element 
    } 
    if($error_mess=mysqli_error($conn)){ 
     echo "Query syntax error @ $current_key where TranID=$tranid & Ack=$Ack<br>$error_mess<br>"; 
    } 
    $error_mess=""; // clear for next iteration 
} 
mysqli_close($conn); 
+0

Чем больше я думаю об этом, я бы предпочел настроить $ sql для хранения каждого запроса, а затем запустить mysqli_multi_query() один раз за пределами цикла foreach. – mickmackusa

Смежные вопросы