#php #mysql #select #rating
#php #mysql #выберите #Оценка
Вопрос:
Я пытаюсь создать систему оценки пользователей на основе содержимого, хранящегося в 2 таблицах MYSQL.
Одна таблица называется «imagemarkers», а другая «markers».
Я хочу проверить строку «authorid», которая одинакова в обеих таблицах, в которой хранится число, основанное на «authorid» пользователя.
Я хочу показать конкретное изображение на основе количества раз, когда конкретный идентификационный номер пользователя встречается в «authorid» из обеих таблиц «markers» и «imagemarkers».
это объявлено в верхней части страницы:
$theID = $_GET['id'];
Код, который у меня есть до сих пор, является:
<? $img0 = "<img src='../webimages/0star.png'>";
$img1 = "<img src='../webimages/1star.png'>";
$img2 = "<img src='../webimages/2star.png'>";
$img3 = "<img src='../webimages/3star.png'>";
$img4 = "<img src='../webimages/4star.png'>";
$img5 = "<img src='../webimages/5star.png'>"; ?>
<? $result3 = mysql_query("SELECT * FROM `markers`, `imagemarkers` WHERE authorid = $theID");
$rows = mysql_num_rows($result3); ?>
<?php
while($row = mysql_fetch_array($result3)){
if ($result3 > 1) {
echo "$img1";
} elseif ($result3 == 5) {
echo "$img2";
} elseif ($result3 == 10) {
echo "$img3";
} elseif ($result3 == 20) {
echo "$img4";
} elseif ($result3 == 30) {
echo "$img5";
} else {
echo "$img0";
}
?>
<? } ?>
Строка моей таблицы mysql «authorid» хранится как INT, 11 и помечена галочкой allow null.
Ошибка, которую я получаю, это:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource....
Пожалуйста, помогите мне решить это.
Большое вам спасибо за ваше время.
Обновление, это новый код, который у меня есть, и он все еще отображает ‘$ img0’, когда он должен показывать ‘$ img3’:
<? $img0 = "<img src='../webimages/0star.png'>";
$img1 = "<img src='../webimages/1star.png'>";
$img2 = "<img src='../webimages/2star.png'>";
$img3 = "<img src='../webimages/3star.png'>";
$img4 = "<img src='../webimages/4star.png'>";
$img5 = "<img src='../webimages/5star.png'>"; ?>
<? $row[0] = mysql_query("SELECT * FROM `markers`, `imagemarkers` WHERE authorid = '". (int)$theID."'");
if ($row[0] > 1) {
echo "$img1";
} elseif ($row[0] > 5) {
echo "$img2";
} elseif ($row[0] > 10) {
echo "$img3";
} elseif ($row[0] > 20) {
echo "$img4";
} elseif ($row[0] > 30) {
echo "$img5";
} else {
echo "$img0";
}
?>
Я подсчитываю, где отображается конкретный номер пользователя и соответствует ‘theID’ в строке ‘authorid’, из обеих таблиц ‘imagemarkers’ и ‘markers’. Пользователь хранит другие данные в базе данных, и, сохраняя это, заполняет строку ‘authorid’ как в ‘markers’, так и в ‘imagemarkers’ в зависимости от того, какую форму они заполняют для сохранения информации.
Я надеюсь, это поможет вам понять, что я пытаюсь сделать..
Ответ №1:
заключите его в одинарные кавычки $theID
, также убедитесь, что $theID отмечен как целое число или поместите (int) перед ним:
$result3 = mysql_query("SELECT * FROM `markers`, `imagemarkers` WHERE authorid = '".(int)$theID."'");
если ошибка все еще возникает, замените на this и посмотрите, какую ошибку вы получите:
$result3 = mysql_query("SELECT * FROM `markers`, `imagemarkers` WHERE authorid = '".(int)$theID."'") or die(mysql_error());
Потому что тогда $result3
нет допустимого ресурса результатов для mysql_num_rows
Комментарии:
1. Отлично! спасибо, первая инструкция select сработала. он отображает изображение, но показывает ‘$ img0’, когда пользователь ‘authorid’ встречается 14 раз в ‘markers’ и ‘imagemarkers’, поэтому должно отображаться ‘$ img5’, так что, должно быть, что-то не так с моим оператором IF…
2. Ваш запрос еще не оптимизирован. Лучше создайте новый вопрос здесь, поскольку первоначальный вопрос решен. Вы должны спросить себя (и сказать нам), почему вы используете 2 таблицы, а не только 1, и какова их взаимосвязь / структура.
Ответ №2:
<?
$result3 = mysql_query("SELECT * FROM `markers`, `imagemarkers` WHERE authorid=".(int)$theID.")";
$rows = mysql_num_rows($result3);
?>
Ответ №3:
Прежде всего, если строка ‘authorid’ существует в обеих таблицах, вы должны указать в запросах, на какую из них вы ссылаетесь:
$theID = intval($_GET['id']); // to avoid SQL-injections
$result3 = mysql_query("SELECT * FROM `markers` m, `imagemarkers` im WHERE m.authorid = $theID AND im.authorid = $theID");
// m and im are just table-aliases for brevity, you can use whatever names you like
Во-вторых, замените $result3 на $row [0] везде внутри цикла «while»:
if ($row[0] > 1) { ...
И, наконец, что-то не так с логикой.
Можете ли вы объяснить полную структуру базы данных, какие столбцы там есть, кроме authorid?
Комментарии:
1. в этом случае
m.authorid = im.authorid AND m.authorid = '".(int)$theID."'
лучше использовать. Это соединяет обе таблицы.2. Да, это могло бы быть лучше. Проблема в том, что я понятия не имею, что происходит и зачем нужны две таблицы 😉 Нужна дополнительная информация из topic starter. P.S. Зачем,
(int)
когда естьintval()
?3. должно быть, пропустил значение intval 😉