Вставка строки из xml в mysql работает, но иногда приводит к PDOException: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 - PullRequest
0 голосов
/ 23 мая 2018

Я отправляю запрос в Amazon mws API и получаю детали заказа в виде xml / json, который затем сохраняю в базе данных mysql.

Большая часть данных будет сохранена без каких-либо проблем, но для одного заголовка элементаЯ получаю следующую ошибку:

PDOException: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка;проверьте правильность синтаксиса в руководстве, соответствующем версии вашего сервера MySQL, рядом с надписью «Обувь и сандалии (черный, взрослый-М США (7 ~ 10) / ЕС (39 ~ 43))», «0», «0») 'в строке 2

Код php для вставки выглядит следующим образом:

foreach ($allorders as $orders){

$orderiddetail = $orders->amazonorderid;
// SET Paramater for API request

require("amazonListOrderItems.php");


$quantityordered = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['QuantityOrdered'];
$quanityshipped = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['QuantityShipped'];
$title = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['Title'];
$sellersku = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['SellerSKU'];
$asin = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['ASIN'];


// INSERT
try {
      $statement = $pdo->prepare("INSERT INTO order_details(amazonorderid, asin, sellersku, title, quantityordered, quantityshipped)
        VALUES ('$orderiddetail', '$asin', '$sellersku', '$title', '$quantityordered', '$quanityshipped')");
      $statement->execute();
    } catch (PDOException $e) {
    if ($e->errorInfo[1] == 1062) {
       $result = "Double entry";
    } else {
echo $e;
break;
}
}
// INSERT  END

};

Текст сообщения об ошибке взят из переменной $ title, $ amountordered, $ amountshipped.

Подскажите, пожалуйста, какие символы вызывают ошибку?Я использую одинарные кавычки (') для вставки, поэтому я подумал, что косая черта (/) не должна быть проблемой?После того, как я проверил, я обнаружил, что тильда (~) является символом UTF8 и тоже не должна быть проблемой?

Как я уже сказал, вставка будет работать около 20 ордеров, а затем остановится для этогоодин заказ.

1 Ответ

0 голосов
/ 23 мая 2018

Мне удалось изменить это на подготовленные заявления, как сказал @ juergen-d.Большое спасибо.У меня были некоторые ошибки, касающиеся переменных, которым не разрешено быть NULL, поэтому я также настроил некоторые переменные, если NULL строк.Также слово «asin» кажется зарезервированным в php, поэтому я изменил его на asins.

foreach ($allorders as $orders){

$orderiddetail = $orders->amazonorderid;
// SET Paramater for API request

require("amazonListOrderItems.php");


$quantityordered = (int)$orders['ListOrderItemsResult']['OrderItems']['OrderItem']['QuantityOrdered'];
$quanityshipped = (int)$orders['ListOrderItemsResult']['OrderItems']['OrderItem']['QuantityShipped'];
$title = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['Title'];
if($title === NULL){
  $title = "";
}
$sellersku = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['SellerSKU'];
if($sellersku === NULL){
  $sellersku = "";
}
$asins = $orders['ListOrderItemsResult']['OrderItems']['OrderItem']['ASIN'];
if($asins === NULL){
  $asins = "";
}

// INSERT
try {
      $statement = $pdo->prepare("INSERT INTO order_details(amazonorderid, asins, sellersku, title, quantityordered, quantityshipped)
        VALUES (:orderiddetail, :asins, :sellersku, :title, :quantityordered, :quanityshipped)");
         $statement->bindValue(':orderiddetail', $orderiddetail, PDO::PARAM_STR);
         $statement->bindValue(':asins', $asins, PDO::PARAM_STR);
         $statement->bindValue(':sellersku', $sellersku, PDO::PARAM_STR);
         $statement->bindValue(':title', $title, PDO::PARAM_STR);
         $statement->bindValue(':quantityordered', $quantityordered, PDO::PARAM_INT);
         $statement->bindValue(':quanityshipped', $quanityshipped, PDO::PARAM_INT);
      $statement->execute();
    } catch (PDOException $e) {
    if ($e->errorInfo[1] == 1062) {
       $result = "Double entry";
    } else {
echo $e;
break;
}
}
// INSERT  END

};
// END of foreach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...