2013-05-24 3 views
-2

Я хочу, чтобы добавить данные из моей БД в массив, когда пользователь нажимает на ссылку Е.Г.Добавляя содержимое в массив

echo '<a href="cart-page.php?action=add&cartid='.$row[0].'">ADD</a>'. 

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

$cart = $_GET['cartid']; 
$cartData = array(); 
$SQL = "SELECT * FROM tbl_product where id ='$cart'"; 
$result = mysql_query($SQL); 
while($row = mysql_fetch_assoc($result)){ 
      array_push($cartData, $row); 
     } 

    $length = count($cartData); 
    for($i = 0; $i < $length; $i++) { 
     echo '</tr>'; 
     echo ' <td class="product">'.$cartData[$i]['name'].'</td>'; 
     echo'<td class="quantity"><input type="text" value='.$cartData[$i]['quantity'].' class="inputform"/></td>'; 

    echo '</tr>'; 

    } 

Моя проблема array_push() не добавляя данные. Каждый раз, когда я перемещаюсь от cart-page.php и нажимаю ссылку, предыдущий контент в cartData [] перезаписывается, оставляя только одну строку в cartData [] за раз. Как я могу получить данные, добавленные в cartData [], когда я нажимаю ссылку, как показано выше? Спасибо

+0

Вы должны вставить его – Ven

+5

'cartid =" 'или' 1 '=' 1 '"' Boooom! – elclanrs

+0

как @elcanrs написал BOOM и ваш Db не существует – Robert

ответ

1

Необходимо ли его использовать? Почему бы просто не добавить его в массив и заказать массив позже?

PHP array sorting

while($row = mysql_fetch_assoc($result)){ 
    $cartData[] = $row; 
} 

Кроме того, вы всегда должны избежать данных.

$cart = $_GET['cartid']; 

Вышеприведенный код является vunerable для SQL-инъекции. По крайней мере, убежать!

$cart = mysql_real_escape_string($_GET['cartid']); 

EDIT

Для того, чтобы помнить все предыдущие корзины дополнения, вам нужно будет создать сеанс, и добавить каждый нажмите на него:

session_start(); 

$cartid = mysql_real_escape_string($_GET['cartid']); 

function addToCart($cartid) 
{ 
    $SQL = "SELECT * FROM tbl_product where id ='{$cartid}'"; 

    $result = mysql_query($SQL); 
    while($row = mysql_fetch_assoc($result)){ 
     $_SESSION['cartItems'][] = $row; 
    } 
} 


function getCartItems() 
{ 
    print_r($_SESSION['cartItems']); 
} 

Будем надеяться, работать вы ожидаете. Сессии сохраняют состояние в браузере. Чтобы использовать этот код, если вы хотите добавить элементы в исходную $ cartData, вам нужно вызвать функцию addToCart($cartid). Это добавит элемент данных в массив cartItems сессии

Чтобы увидеть, что там в корзине, как массив, просто используйте print_r($_SESSION['cartItems']);

+0

Я уже пробовал то, что вы предлагаете, но дал тот же результат, поэтому я решил использовать array_push(). Каждый раз, когда этот цикл выполняется, содержимое $ cartData [] перезаписывается. вот где я в замешательстве. – dhani

+0

@dhani, имея в виду, что вы только когда-либо извлекаете одну запись из базы данных, я обновил свой пример выше, в цикле 'while', я добавил цикл foreach. Каждый ключ массива $ row теперь должен быть добавлен в массив $ cartData с его значением. Если вы хотите попробовать попробовать? –

+0

Спасибо, Фил. Но это то же самое. У меня есть страница list.php со ссылкой «ADD». Каждый раз, когда пользователь нажимает ADD, я получаю идентификатор этого элемента, запрашиваю DB, помещаю результаты в cartData и показываю их на cart-page.php. Но когда я возвращаюсь в list.php и нажимаю другой элемент, элементы, которые ранее были в $ cartData [], перезаписываются. Это похоже на корзину. – dhani

1

Короткий ответ: Ваш вопрос не то, что вы не добавляете элемент в массив , вы не понимаете, как работают массивы. Массивы не сохраняются на разных страницах, они создаются в единую среду выполнения одного сценария, если не указано иное.

MAJOR безопасности изъян # 1 - Отправка cartid в URL:

Edit: я понял это. Ваша переменная cartid относится к product_id. Это очень плохое имя переменной, любой программист предполагает, что это относится к идентификатору корзины покупок. Хотя этот недостаток безопасности не имеет отношения к этому случаю, я оставляю его здесь для тех, кто неправильно понимает ваш код и решает его скопировать.

Во-первых, это URL проблема:

echo '<a href="cart-page.php?action=add&cartid='.$row[0].'">ADD</a>' 

Это означает, что, если я могу угадать другого пользователя корзины ID, я могу добавить элементы в своей корзине, посетив cart-page.php?action=add&cartid=100 где 100 является телегу другого пользователя ID ,Вы должны обрабатывать переменную $cart с использованием утвержденного session, а не отправлять их через Интернет через GET или POST запросы, с которыми можно манипулировать пользователем.

MAJOR недостаток безопасности # 2 - Уязвимость к инъекциям SQL:

Заявление

$SQL = "SELECT * FROM tbl_product where id ='$cart'"; 

невероятно опасно. Скажем, я представить это в моем URL (правильно закодированы, конечно):

cartid = 2'; DROP TABLE tbl_product; SELECT * FROM tbl_product WHERE cartid=' 

Это будет затем выполнить следующий запрос на вашей базе данных:

SELECT * FROM tbl_product where id ='2'; DROP TABLE tbl_product; SELECT * FROM tbl_product WHERE cartid=''; 

Если вы хотите, чтобы избежать этого, у вас есть несколько вариантов. Лучшие из этих вариантов является переход к использованию prepared statements, самый простой из этих вариантов является использование mysql_real_escape_string на все, что вы положили в вашу базу данных, как это:

$SQL = "SELECT * FROM tbl_product where id ='" . mysql_real_escape_string($cart) . "';"; 

После того, как вы исправили выше, мы можем исправить остальную часть кода:

Сначала мы хотим поместить ваши результаты в массив. Как $results уже ассоциативный массив, вы можете использовать его непосредственно или хранить его, как это:

$cartData = $results; 

Keeping продуктов в корзине

Edit: я понял, что вы делаете, вы» повторно используя переменную, называемую $cart, чтобы сохранить идентификатор продукта, вам нужно отсортировать имена переменных.

Для того, чтобы иметь массив, который будет сохраняться на нескольких загрузке страницы, вам нужно будет сделать его переменной сеанса, сначала вы должны начать PHP сессии:

session_start(); 

использовать переменную сессии как это:

$_SESSION['shopping_cart'] = array(); 

Затем, когда вы добавить "продукт, сделать это:

$_SESSION['shopping_cart'][$cartData['id']] = array(
    'name'=>$cartData['name'], 
    'quantity'=>1 
); 

При изменении количества, это:

$_SESSION['shopping_cart'][$productId]['quantity'] = $newQuantity; 

Теперь, когда вы показываете тележку, вместо отображения непосредственно из продуктов, вставить в массив с помощью выше первого, а затем вернуть содержимое $_SESSION['shopping_cart'].

foreach изготовлен для массива поперечной, используйте его!

Наконец, не следует использовать некрасивый for цикл для перебора массива, просто сделать:

<?php foreach($_SESSION['shopping_cart'] as $product): ?> 
<tr> 
    <td><?php echo $product['name'] ?></td> 
    <td><input type='text' value='<?php echo $product['quantity'] ?>'></input></td> 
</tr> 
<?php endforeach; ?> 

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

Рекомендации по данному проекту:

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

Я также предлагаю вам ознакомиться с некоторыми (свободными, с открытым исходным кодом) средами MVC, такими как Zend и CakePHP. Они не будут делать всю работу за вас, но они упростят вашу работу, чтобы ваш код был хорошо сохранен и читабельным.

+0

Спасибо за указатели и советы. – dhani

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