Member 13637584 Ответов: 2

Как мне остановить этот процесс от повторного запуска?


For the code below, the Insert statement I only need to happen ONCE. When the while loop is performed and the items are displayed for user.

is there anyway to do this?

I need duplicate entries in the database so I cant do that. see code below


Что я уже пробовал:

$insertedMeal = false;
while($dbRow=$dbQuery->fetch(PDO::FETCH_ASSOC) and ($cnt < $max)) 
{
  echo "//displays information from table"
  $cnt++;
  $MealID=$dbRow["MealID"]
if (!$insertedMeal) {
    $insertedMeal = true;

$stmt=$conn->prepare("INSERT into Meals (UserID, MealID) VALUES (:UserID, :MealID) "); 
$stmt->execute(array(
':UserID' => $UserID,
':MealID' => $MealID
));
 } //end

2 Ответов

Рейтинг:
2

Wendelius

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

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


Member 13637584

Когда я перемещаю его за пределы цикла, он не вставляется в базу данных правильно?

Wendelius

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

Member 13637584

Я действительно пытался это сделать, так как держал $MealID=$dbRow["MealID"] внутри цикла, а затем ссылался на него вне цикла, но все равно не работает правильно?

Wendelius

Если вы назначаете $MealID внутри цикла, ничего не исследуя, то $MealID будет содержать последний MealId при выходе из цикла. В этом ли проблема?

Member 13637584

Да вот именно так?

Wendelius

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

while loop
if some_condition is true then
set $mealid to desired value
end if
advance to next record
end loop
use $mealid in insert statement

Member 13637584

это в основном, когда пользователь заходит на страницу(в первый раз), я хочу, чтобы эта вставка работала, и это все? Будет ли если заявление работать?

Wendelius

Это совершенно невозможно ответить, не видя всего кода. Но в целом, если вам нужно выполнить что-то условно, то да, если это один из способов сделать это.

Member 13637584

существует ли оператор if, который может указать, когда пользователь впервые заходит на страницу?

Wendelius

Вы можете хранить информацию о посещениях страниц в файле cookie. Взгляните на это PHP: Cookies - руководство пользователя[^]

Member 13637584

К сожалению, я не хочу этого делать по нескольким причинам. Как вы можете помочь мне с утверждением IF? Я попробовал оператор if, но он, похоже, не работает - см. обновленный код выше

Wendelius

Прости, но мне трудно понять, что тебе нужно.

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

Или проблема в том, что вы хотите запустить инструкцию insert, но не хотите, чтобы вставка произошла, если запись уже существует?

Пожалуйста, опишите ситуацию более подробно.

Member 13637584

В принципе, мне нужно, чтобы это было запущено один раз, так как, как только это будет в базе данных, мне это больше не нужно. Мне не нужно отслеживать посещения страниц,когда пользователь получает эти элементы displayeed(первая часть цикла while), вот почему оператор INSERT должен произойти, но мне трудно остановить эту конкретную часть цикла от цикла каждого обновления. Мне нужно, чтобы он сделал вставку один раз и остановился - он помещает значения в базу данных.

Рейтинг:
1

Patrice T

Этот код просто неправильный и не может быть выполнен из-за отсутствия 2 ')'

$stmt->execute(array(
':UserID' => $UserID,
':MealID' => $MealID


Member 13637584

Извините, но у меня это есть в Кодексе. Я обновил вышесказанное.

Patrice T

действительно, так будет лучше.

Member 13637584

@ppolymorphe у вас есть какое-нибудь решение этой проблемы??

Patrice T

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