Рейтинг:
2
Wendelius
Проблема в том, что вы объединяете ключевое слово без Апостроф, поэтому запрос выглядит следующим образом
SELECT * FROM Meals where Category='Breakfast' AND Keyword=K1
Для того чтобы запрос был запущен он должен выглядеть так
SELECT * FROM Meals where Category='Breakfast' AND Keyword='K1'
Однако для предотвращения SQL-инъекции следует использовать параметры. Взгляните на это
PHP подготовленные заявления[
^]
Member 13637584
см. раздел отредактированный пост.
Wendelius
Просто чтобы убедиться, что первый запрос из таблицы результатов в порядке?
Кроме того, есть ли в базе данных строки в таблице питания, имеющие значение "K1" в столбце ключевых слов?
Member 13637584
Да, результаты в порядке. В принципе (надеюсь, это имеет смысл) В моей таблице результатов есть..USERID, с номерами B1-B9. С 1 или 0 (правда, они выбрали его, ложь-нет) Затем я определяю их как ключевые слова в еде. Как и в таблице блюд, ключевые слова находятся рядом с едой, так что,например, если пользователь хочет поесть с беконом init, проверяет ключевое слово в таблице блюд, а затем выводит это блюдо? Есть ли в этом смысл?
Wendelius
Не могли бы вы поделиться примерами данных из таблицы питания. Я считаю, что это помогло бы понять проблему.
Member 13637584
см. раздел отредактированный пост. Извините, что это полный беспорядок, надеюсь, вы это понимаете. (В принципе,скажем, пользователь ставит галочку да на хлопья - тогда itl переходит в DB как 1 AKA True)
Wendelius
Хорошо, если ключевое слово содержит "хлопья", то без параметров запрос будет выглядеть следующим образом
SELECT * FROM Meals where Category='Breakfast' AND Keyword='cereal'
Однако, глядя на код, запрос выглядит следующим образом
SELECT * FROM Meals where Category='Breakfast' AND Keyword='K1'
В результате ни одна из строк не удовлетворяет условию, поэтому вы не получаете никаких результатов. Или я что-то упускаю?
Wendelius
Чтобы получить дополнительную информацию: в PHP-коде попробуйте распечатать значение из ключевого слова $перед выполнением команды SQL. Это значение, которое будет использоваться при выполнении.
Member 13637584
строка(2) "K1" строка(2) "K2" строка(2) "K3" строка(2) "K4" строка(2) "K5" строка(2) "K6" строка(2) "K7" строка(2) "K8" строка(2) "K9"
Wendelius
Итак, действительно ли K1-это переменная $K1, которая определена где - то еще и содержит значение "зерновые"?
Member 13637584
Да, точно так же, как приведенный выше код говорит $K1= ("сыр"); это продолжается до K9, например $K9 = ("хлопья");
Wendelius
Из того, что я понял, проблема заключается в том, что в настоящее время у вас есть 9 различных переменных $K1 ... $K9, и вы пытаетесь выбрать значение из одного из них на основе счетчика. Однако имя переменной не является индексом, поэтому использование значения путем ссылки на него с помощью целочисленного счетчика становится громоздким.
Я бы посоветовал вам изменить свой код так, чтобы у вас не было отдельной переменной $K1, $K2, ... Вместо этого у вас будет массив с именем $K, содержащий 9 элементов. Иначе говоря
$K = array("cheese", "cereal", ...);
Теперь вы можете использовать этот массив вдоль счетчика внутри вашего цикла. Что-то вроде
for ($number = 1; $number <= 9; ++$number) {
...
$dbQuery = $conn->prepare("SELECT * FROM Meals where Category='Breakfast' AND Keyword=:Keyword");
$dbParams = array(':Keyword'=> $K[$number]);
$dbQuery->execute($dbParams);
...
Member 13637584
Я сам думал об этом с массивом, однако, будет ли он работать,так как B1 нигде не определен, поэтому я определял его через K1, K2? будет ли этот массив теперь повторять B1,B2,B3? поскольку B1,B2,B3,B4 в базе данных все имеют значения для них, те,которые я определил с помощью K1, K2.. и т. д. Надеюсь, что это имеет смысл
Wendelius
Можете ли вы снова опубликовать некоторые примеры данных, касающихся B1, B2 и так далее. Я еще не совсем понимаю, как связаны Б1 и К1.
Member 13637584
Смотрите отредактированный пост сейчас.
Wendelius
Ладно, я понял. Подход грубой силы будет заключаться в том, что вы придерживаетесь массива K. При циклическом переходе от 1 к 9 проверьте соответствующую переменную B?, чтобы узнать, нужно ли включать ключевое слово или нет. Это потребовало бы жесткого кодирования переменных B? в ваш код
Однако я бы предложил изменить структуру базы данных. Вместо того чтобы хранить пользовательские параметры в строке пользователя, сохраните их как строки в дочерней таблице.
Другими словами, у вас будет, например, таблица user, а затем таблица userchoice. Userchoice будет содержать все выбранные пользователем значения, то есть 1. каждая из этих строк также будет содержать ссылку на ключевое слово the. Таким образом, userchoice, содержащий значение 3 в выборе, будет означать, что этот пользователь хочет бекон.
Наличие такой структуры облегчит ваши запросы, а простое соединение, вероятно, вернет все необходимые результаты. Вам не придется делать никаких петель или чего-то подобного.
Member 13637584
Как насчет того, чтобы из B1, B2,B3 и т. д. иметь их в виде сыра,бекона...?? сработает ли это?
Member 13637584
ладно, в этом есть большой смысл! Есть ли способ, которым я могу иметь его для Keyword=Keywowrd, чтобы он был "хлопьями" и т. д. Я мог бы сделать отдельный оператор для каждого из них, но цикл наверняка должен сделать то же самое и сохранить работу? Просто хотите, чтобы он прошел через эти 1-9? ты мой единственный шанс здесь @Wednelius очень надеюсь, что ты сможешь мне помочь
Рейтинг:
2
Patrice T
Мы не можем запустить ваш код, вы единственный, кто может что-то проверить.
В первую очередь проверить все переменные содержат то, что надо
Любой echo
все переменные, включая запросы и количество строк, полученных в результате этих запросов.
Другой способ сделать это - использовать отладчик.
Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
phpdbg | php отладчик[^]
Методы отладки для PHP-программистов[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
$K1 = ("cheese"); (K1-9 of these are define with different values)
$dbQuery = $conn->prepare("SELECT * FROM Results where UserID=:UserID");
$dbParams = array(':UserID'=>$UserID);
$dbQuery->execute($dbParams);
while ($dbRow = $dbQuery->fetch(PDO::FETCH_ASSOC))
{
for ($number = 1; $number <= 9; ++$number) { //9 words
$breakfast = "B$number";
$Meal = $dbRow[$breakfast];
}
}
for ($number = 1; $number <= 9; ++$number) {
$Keyword = "K$number";
$breakfast = "B$number";
if ($Meal == '1')
{
$dbQuery = $conn->prepare("SELECT * FROM Meals where Category='Breakfast' AND Keyword=:Keyword");
$dbParams = array(':Keyword'=> $Keyword);
$dbQuery->execute($dbParams);
Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[
^]
личные[
^]
Member 13637584
Привет @ppolymorphe, мы добрались до ключевой проблемы, и она заключается в следующем :Ключевое слово проверяет "K1-K9" на самом деле не ключевые слова, Есть ли у вас какой-либо вклад в эту проблему?
Patrice T
Обновите свой вопрос
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Member 13637584
Ладно, сойдет. Так о чем ты думаешь? Есть ли какой-нибудь способ обойти это? или мне нужно будет подумать о перепроектировании БД.