Я создаю веб-страницу, которая загружает случайный продукт из одной таблицы (таблица «Продукты») из моей базы данных каждый раз, когда страница перезагружается. Пользователь, вошедший в систему (пользователь должен быть авторизован), может выбрать, добавлять этот продукт в свои личные избранные или нет (хранится в таблице «Избранное»). Каждый раз, когда пользователь нажимает соответствующую кнопку, чтобы добавить этот продукт в избранное, веб-страница перезагружается и показывает новый случайный элемент. Проблема в том, что веб-страница, вероятно, перезагружается перед выполнением запроса, поэтому вместо этого в избранное добавляется «новый» элемент. Кто-нибудь знает, как я могу это решить? Вот что у меня получилось:

HTML

<form method="get">
    <button type="submit" name="like">
    <img class="add-to-favorites" src="image.png">
    </button>
</form>

PHP

header("Cache-Control: no-cache, must-revalidate");
session_start();
include_once 'dbconnect.php';

$user_id = ($_SESSION['user']);

$sSQLQuery = "SELECT product_id FROM Products ORDER BY RAND()";
$aResult = mysql_query($sSQLQuery);  
$aRow = mysql_fetch_array($aResult, MYSQL_ASSOC);
$productid = $aRow['product_id'];  


if(isset($_GET['like'])){
$SQL = "INSERT INTO Favorites(user_id,product_id)
VALUES('$user_id','$aRow[product_id]')";
$result = mysql_query($SQL);
}
php
1
Coen3000 30 Дек 2015 в 01:27

3 ответа

Лучший ответ

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

<form method="get">
    <input type="hidden" name="current_product_id" value="<?php echo $productid; ?>">
    <button type="submit" name="like">
    <img class="add-to-favorites" src="image.png">
    </button>
</form>

Где <?php echo $productid; ?> - идентификатор нового случайного продукта.

Ваш PHP должен идти в таком порядке и со следующими значениями:

if(isset($_GET['like'])){
    $SQL = "INSERT INTO Favorites (user_id,product_id) VALUES ('$user_id','$_GET[current_product_id]')";
    $result = mysql_query($SQL);
}

$sSQLQuery = "SELECT product_id FROM Products ORDER BY RAND()";
$aResult = mysql_query($sSQLQuery);  
$aRow = mysql_fetch_array($aResult, MYSQL_ASSOC);
$productid = $aRow['product_id'];

Итак, теперь, если вы нажмете лайк, $_GET['current_product_id'] будет иметь текущий продукт, а затем я выведу новый случайный идентификатор продукта в скрытый ввод, чтобы следующий элемент тоже работал!

Также: важно, подумайте об использовании функций mysqli_ * вместо функций mysql_ *, потому что последние устарели :)

0
Zeke 25 Мар 2017 в 05:02

Во-первых, PDO ... Всегда: P.


Но чтобы ответить на ваш вопрос, вам нужно отправить product_id вместе с $ _GET ['like'], чтобы вы знали, какой продукт они выбрали. Поскольку вы случайным образом выбираете один из базы данных при каждой загрузке.

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


Как я могу предотвратить внедрение SQL в PHP?

* Ссылка на кредиты с Шоном (комментарий)

0
Community 23 Май 2017 в 12:17

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

Очевидно, вам нужно передать старый идентификатор продукта в GET-Parameters. Для этого есть много вариантов, например, создание скрытого поля.

echo "<input type=\"hidden\" name=\"oldProductId\" value=\"$productid\">

Затем вы можете получить к нему доступ, когда страница перезагрузится с помощью

$_GET['oldProductId']

И записываем в избранное-таблицу.

0
Bobface 29 Дек 2015 в 22:37