2013-05-01 3 views
0

После того, как вы пытаетесь понять, как это работает, я решил попросить несколько советов, как я могу это сделать.Проблема с обновлением таблицы с массивами

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

Это оригинальный код (который я все еще использую другое место в коде, кажется, он работает отлично).

function showCart() { 
global $db; 
$cart = $_SESSION['cart']; 
if ($cart) { 
    $items = explode(',',$cart); 
    $contents = array(); 
    foreach ($items as $item) { 
     $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1; 
    } 
    $output[] = '<form action="kurv.php?action=update" method="post" id="cart">'; 
    $output[] = '<table>'; 
    foreach ($contents as $id=>$qty) { 
     $sql = 'SELECT * FROM varetabel WHERE varenr = '.$id; 
     $result = $db->query($sql); 
     $row = $result->fetch(); 
     extract($row); 
     $output[] = '<tr>'; 
     $output[] = '<td><a href="kurv.php?action=delete&varenr='.$id.'" class="r">Slet</a></td>'; 
     $output[] = '<td>'.$varenavn.'</td>'; 
     $output[] = '<td>DKK '.$pris.'</td>'; 
     $output[] = '<td><input type="text" name="qty'.$id.'" value="'.$qty.'" size="3" maxlength="3" /></td>'; 
     $output[] = '<td>DKK '.($pris * $qty).'</td>'; 
     $total += $pris * $qty; 
     $output[] = '</tr>'; 
     $_SESSION['items'] = $contents; // Antal forskellige varer. 
     $_SESSION['qty'] = $qty; 
    } 
    $output[] = '</table>'; 
    $output[] = '<p>Pris total: <strong>DKK '.$total.'</strong></p>'; 
    $output[] = '<div><button type="submit">Opdatér kurv</button></div>'; 
    $output[] = '</form>'; 
} else { 
    $output[] = '<p>Kurven er tom.</p>'; 
} 
return join('',$output); 

}

глобальный $ дб подключается к БД и такой, не Бигги, и тогда эта функция от включаемого:

function fetch() { 
    if ($row=mysql_fetch_array($this->query,MYSQL_ASSOC)) { 
     return $row; 
    } else if ($this->size() > 0) { 
     mysql_data_seek($this->query,0); 
     return false; 
    } else { 
     return false; 
    } 
} 

Теперь им пытаются использовать тот же метод, чтобы взять массивы из этого кода и поместить их в мою базу данных с этим кодом:

session_start(); 
global $db; 
$items = $_SESSION['items']; 
$cart = $_SESSION['cart']; 
$qty = $_SESSION['qty']; 

if(isset($_SESSION['email'])) { // IF LOGGED IN 

$sql = mysql_query("SELECT * FROM antalstabel ORDER BY ordrenr DESC LIMIT 1") or die(mysql_error()); 
$row = mysql_fetch_assoc($sql); 
$maxordrenr = $row['ordrenr']; 
$nextnumber = $maxordrenr + 1; 
$antal = count($items); // COUNTS DIFFERENT ITEMS IN CART. 
$maxplusantal = $maxordrenr + $antal; 
$varenrplaceholder = 0; 

for ($i = $maxordrenr; $i <= $maxplusantal; $i++) { 

$sql = mysql_query("INSERT INTO antalstabel (ordrenr, varenr) VALUES ('$nextnumber','$varenrplaceholder')") or die(mysql_error()); 
$nextnumber--; 
$varenrplaceholder++; 

} 

$varenrplaceholder = 0; 

if ($cart) { 
$items = explode(',',$cart); 
$contents = array(); 

foreach ($items as $item) { 

$contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1; 

} 

foreach ($contents as $id=>$qty) { 

$sql = 'UPDATE antalstabel SET varenr = '.$id.' and antal = '.$qty.' WHERE ordrenr = '.$nextnumber.' and varenr = '.$varenrplaceholder.''; 
$result = $db->query($sql); 
$row = $result->fetch(); 
extract($row); 
$varenrplaceholder++; 

} 
} 

Но это d oes, похоже, не работает должным образом, код действительно работает, но он не обновляет таблицу со значениями массивов.

Я совершенно не прав или могу помочь мне с этой проблемой, я знаю, что много спросить.

мой собственный код создает X строк с одинаковым идентификатором в зависимости от того, сколько разных элементов в корзине, я пытаюсь обновить те существующие строки, которые я только что создал, со значениями, которые, как я полагаю, все еще находятся в массивах функции showCart().

Спасибо заранее

+0

который ошибкой вы получаете? –

+0

Предупреждение: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, boolean задан в /mysql.class.php в строке 151 Предупреждение: mysql_num_rows() ожидает, что параметр 1 будет ресурсом, логическим значением в /mysql.class.php on line 167 Предупреждение: extract() ожидает, что параметр 1 является массивом, логическим значением которого является /bestil.php в строке 48 –

+0

то, что вы хотите извлечь из запроса $ $ result = $ db-> ($ sql); $ row = $ result-> fetch(); 'вы обновляете поле, которое не извлекает записи –

ответ

0

есть ошибка в вашем строке кода

foreach ($contents as $id=>$qty) { 

$sql = 'UPDATE antalstabel SET varenr = '.$id.',antal = '.$qty.' WHERE ordrenr = '.$nextnumber.' and varenr = '.$varenrplaceholder.''; 
$varenrplaceholder++; 

} 

$select_query='SELECT * FROM varetabel WHERE varenr = '.$id; 
$result = $db->query($select_query); 
$row = $result->fetch(); 
extract($row); 
+0

и да, вы должны проверить, что запрос успешно выполнен. –

+0

Это действительно избавило от ошибок mysql, однако табуляция по-прежнему не обновляется. спасибо :) –

+0

@VictorNielsen отладить его для ошибки –

1
$sql = 'SELECT * FROM varetabel WHERE varenr = '.$id; 
    $result = $db->query($sql); 

Вы не проверив состояние успеха/неудачи, возвращаемый запросом(). Большинство функций MySQL возвращают false, если есть ошибка, например, имя таблицы с орфографической ошибкой или недопустимое выражение в предложении WHERE.

Я не знаю, что такое $ id, но вы должны проверить строку $ sql, чтобы увидеть, работает ли она (копия & вставляет ее в клиентский сеанс mysql для ее проверки).

И вы всегда должны проверить, что $ result не равен false. См http://php.net/mysql_error

+0

Да, это определенно была первая проблема, которую я имел, спасибо за разъяснение этого :) –

0

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

Однако главное, что я подозреваю, прекращает ваш запрос, заключается в том, что вы подсчитываете количество $ пунктов, прежде чем вы установите $ items в разобранную $ cart.

я сделал следующее, вымышленные имена методов в вашем дб классе

<?php 
session_start(); 
global $db; 
$items = $_SESSION['items']; 
$cart = $_SESSION['cart']; 
$qty = $_SESSION['qty']; 

if(isset($_SESSION['email'])) 
{ // IF LOGGED IN 

    if ($cart) 
    { 
     $sql = "SELECT MAX(ordrenr) AS ordrenr FROM antalstabel"; 
     $result = $db->query($sql) or die($db->error()); 
     if ($row = $result->fetch()) 
     { 
      $maxordrenr = $row['ordrenr']; 
      $nextnumber = $maxordrenr + 1; 
      $items = explode(',',$cart); 
      $antal = count($items); // COUNTS DIFFERENT ITEMS IN CART. 
      $maxplusantal = $maxordrenr + $antal; 
      $varenrplaceholder = 0; 

      for ($i = $maxordrenr; $i <= $maxplusantal; $i++) 
      { 
       $sql = "INSERT INTO antalstabel (ordrenr, varenr) VALUES ('$nextnumber','$varenrplaceholder')"; 
       $db->query($sql) or die($db->error()); 
       $varenrplaceholder++; 
      } 

      $varenrplaceholder = 0; 
      $contents = array(); 

      foreach ($items as $item) 
      { 
       $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1; 
      } 

      foreach ($contents as $id=>$qty) 
      { 
       $sql = "UPDATE antalstabel SET varenr = $id and antal = $qty WHERE ordrenr = $nextnumber and varenr = $varenrplaceholder"; 
       $result = $db->query($sql) or die($db->error()); 
       $row = $result->fetch(); 
       extract($row); 
       $varenrplaceholder++; 
      } 
     } 
    } 
} 
?> 
+0

Это определенно лучше, чем то, с чем я столкнулся, поэтому я буду форматировать этот путь, он работает гладко, если я вложу это решение. Спасибо. –

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