mysql — команда не синхронизирована при выполнении запроса внутри запроса с переполнением стека

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

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

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

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

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

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

Вот мой код:

<?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);?>

Я все еще изучаю PHP, поэтому любая помощь приветствуется.

1

Решение

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

$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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]