2015-07-14 2 views
0

Я строй сценария, чтобы добавить товар в корзину покупок ..Проблемы с PHP, PDO и MySQL

Я хочу сначала проверить, чтобы проверить, есть ли существующая телега таблица для пользователя. Если нет, я хочу создать новую таблицу для корзины покупок.

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

В приведенном ниже коде инструкция UPDATE запускает ли матч itemNumber или нет. Это означает, что исключений нет и что новая строка не вставлена ​​для нового нового itemNumber. Все остальное работает должным образом.

try { 

    // create the shopping cart. If it already exists, throw an exception 

    $cartDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Error Handling 
    $sql = 'CREATE TABLE `' . $table . '` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `itemNumber` VARCHAR(100) NOT NULL, `title` TEXT NOT NULL, `price` VARCHAR(20) NOT NULL, `color` VARCHAR(100) NOT NULL, `size` CHAR(20), `quantity` INT(5) NOT NULL, `category` TEXT NOT NULL, `photo` TEXT NOT NULL);'; 
    $cartDb->exec($sql); 

    try { 

     // if you get this far then the cart has been newly created. Insert the item information into the cart 

     $cartDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $sql = 'INSERT INTO `' . $table . '` (`itemNumber`, `title`, `price`, `color`, `size`, `quantity`, `category`, `photo`) VALUES ("' . $itemNumber . '", "' . $title . '", "' . $price . '", "' . $color . '", "' . $size . '", "' . $quantity . '", "' . $category . '", "' . $photo . '");'; 
     $cartDb->exec($sql); 

    } catch(PDOException $e) { 

     // we got an exception == could not insert the data into the table 

     echo $e->getMessage(); 

    } 

} catch(PDOException $e) { 

    // we got an exception == table already exists 

    echo $e->getMessage(); 

    try { 

     // first see if the item number is already in the table 

     $cartDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $sql = "UPDATE `" . $table . "` SET `quantity` = `quantity` + " . $quantity . " WHERE `itemNumber` = '" . $itemNumber . "'"; 
     $cartDb->exec($sql); 

    } catch(PDOException $e) { 

     // exception thrown == item number is not yet in the table 

     echo $e->getMessage(); 

     try { 

      $cartDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $sql = 'INSERT INTO `' . $table . '` (`itemNumber`, `title`, `price`, `color`, `size`, `quantity`, `category`, `photo`) VALUES ("' . $itemNumber . '", "' . $title . '", "' . $price . '", "' . $color . '", "' . $size . '", "' . $quantity . '", "' . $category . '", "' . $photo . '");'; 
      $cartDb->exec($sql); 

     } catch(PDOException $e) { 

      echo $e->getMessage(); 

     } 

    } 

} 
+0

Независимо от того, что здесь не так, вы не должны создавать и отбрасывать таблицы на лету. Используйте одну таблицу для всех тележек и различайте отдельные тележки с помощью идентификатора пользователя некоторого описания. –

+0

Я бы присвоил значение вашего оператора 'exec()' переменной, например: '$ return = $ cartDb-> exec ($ sql);' then echo this variable. Я считаю, что если ни одна строка не обновляется, она возвращает '0' (количество затронутых строк), а не исключение. – camelCase

+1

Спасибо @ ride_85027, что у меня все работает. –

ответ

1

Я хотел бы присвоить значение вашего exec() заявления переменной, как: $return = $cartDb->exec($sql); затем повторить эту переменную.

Я считаю, что если строки не обновлены, то он возвращает 0 для подсчета затронутых строк, а не для исключения.

0

Вы должны изменить порядок инструкций: Просто введите INSERT перед UPDATE, потому что INSERT поймает исключение, если запись уже существует. UPDATE не будет.

+0

Это имеет смысл. Ответ выше дал мне работу, поэтому я выбрал это как правильный ответ, но это, вероятно, сработает. –