2016-09-18 4 views
1

У меня есть небольшой скрипт, который забирает ячейку из базы данных и после нее записывает ее. Но это может вызвать ошибки 1064. Это выглядит следующим образом:PHP Json to MySql (opencart)

public function update($cart_id, $quantity) { 
    $this->db->query("UPDATE " . DB_PREFIX . "cart SET quantity = '" . (int)$quantity . "' WHERE cart_id = '" . (int)$cart_id . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'"); 
    //starts here 
    $cart_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cart WHERE cart_id = '" . (int)$cart_id. "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'"); 
    $option= ($cart_query->row['option']);//success 
    $this->db->query("UPDATE " . DB_PREFIX . "cart SET option = '" . (string)$option . "' WHERE cart_id = '" . (int)$cart_id . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");//error 
} 

Вот что я вижу в журнале

2016-09-18 20:43:06 - PHP Notice: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'option = '{"options":{"product_id":"176","colors":["000000"],"print":{"colors":{' at line 1<br />Error No: 1064<br />UPDATE oc_cart SET option = '{"options":{"product_id":"176","colors":["000000"],"print":{"colors":{"front":["FF0000"]},"elements":{"front":[{"width":"52.9375","height":"25.0938","type":"text"}]}},"attributes":{"sizememos":"0"},"attribute":[["0","0"]],"print_type":"screen","quantity":"0","design":{"vectors":{"front":[{"type":"text","width":"54.9375px","height":"27.0938px","top":"151px","left":"86px","zIndex":"1","svg":"<svg width="54.9375" height="27.09375" viewBox="0 0 54.9375 27.09375" xmlns="http:\/\/www.w3.org\/2000\/svg" xmlns:xlink="http:\/\/www.w3.org\/1999\/xlink"><g id="0.15760551612925844"><text fill="#FF0000" stroke="none" stroke-width="0" stroke-linecap="round" stroke-linejoin="round" x="" y="" text-anchor="start" font-size="24px" font-family="arial" data-textcurve="1" data-itemzoom="1 1" data-textspacing="0"><textPath xmlns:xlink="http:\/\/www.w3.org\/1999\/xlink" xlink:href="http:\/\/138.68.62.219\/Buy-Hanes-T-shirt-PC61LS#textPath-item-0"><tspan dy="0">Hello<\/tspan><\/textPath><\/text><\/g><defs><path id="textPath-item-0" d="M 0.125 22.117808976867764 A 3093.9720937064453 3093.9720937064453 0 0 1 54.124314613414626 22.117808976867764"><\/path><\/defs><\/svg>","rotate":"0","text":"Hello","color":"#FF0000","fontFamily":"arial","align":"center","outlineC":"none","outlineW":"0"}]},"images":{"front":"cart-designes\/2016\/09\/\/cart-front-1474230421.png","back":"cart-designes\/2016\/09\/\/cart-back-1474230421.png"}},"fonts":""}}' WHERE cart_id = '387' AND customer_id = '0' AND session_id = 'kkfj9svfssdnsph8pf8i5atjn3' in /var/www/html/system/library/db/mysqli.php on line 41 

Что причина? Я просто сохраняю данные, которые уже есть в этой ячейке. Опционная колонка - UTF-8, LongText

+0

Похоже, что проблема заключается в том, что у вас есть строка типа '' outerThing: {innerString: «Я строка, но есть проблема, потому что здесь ->« * Я использую double кавычки снова * ", и это большая проблема"} Часть, окруженная звездами, не является частью 'innerString', и это вызовет некоторые ошибки, поскольку компьютер не имеет понятия, что с ним делать. Если вы можете поместить обратную косую черту перед каждой внутренней двойной кавычкой, это должно устранить проблему. – Howzieky

+0

@Howzieky Я пробовал 'addslashes'' json_decode json_encode'' htmlspecialchars' и т. Д .... он успешно читал декодирование и кодирование JSON, возможно, есть лучший способ его сохранить или ограничение строки запроса ... – tttaaabbb

ответ

0

Ошибка 1064 указывает на ошибку синтаксиса в вашем запросе MySQL. Кажется, некоторые цитаты, которые не удалось избежать в вашей строке JSON, чтобы доказать, что попытайтесь исправить значение параметра короткое значение и снова вызовите вашу функцию.

Лучше всего использовать параметризованные запросы, это избавит вас от всех вылетающих задач и самое главное предлагают некоторую защиту от SQL инъекции

Это просто пример того, как ваш запрос будет выглядеть следующим образом:

$sql="UPDATE table SET opton=:option WHERE cart_id=:id AND customer_id=:customer_id and session_id=:session_id"; 
$parameters = array(
       'option'=>$option, 
       'cart_id'=>$cart_id, 
       'customer_id'=>$customer_id, 
       'session_id'=>$session_id 
      ); 

$sql = $this->db->prepare($sql); 
$sql->execute($parameters); 

Вы можете найти более подробную информацию на официальном PHP документации

http://php.net/manual/en/mysqli.quickstart.prepared-statements.php http://php.net/manual/en/pdo.prepared-statements.php

Счастливый код друга :)

0

Это не работает, потому что OPTION coz является частью синтаксиса MySql. Это работа

$customer_id=(int)$this->customer->getId(); 
    $session_id=$this->db->escape($this->session->getId()); 
    $this->db->query("UPDATE " . DB_PREFIX . "cart SET `option` = '" . (int)$quantity . "' WHERE cart_id = '" . (int)$cart_id . "' AND customer_id = '" . $customer_id . "' AND session_id = '" . $session_id . "'");