PHP - MySql Join - - PullRequest
       27

PHP - MySql Join -

0 голосов
/ 25 июля 2011

Я пытался получить некоторые детали из базы данных MySql, но я работал так долго и перепробовал так много способов, что теперь я полностью потерян: s

Что мне нужно, чтобы получить это две детали, которые зависят от информации из 3 таблиц. Мне нужно получить $ title и $ siteurl (из table_sites) там, где текущий пользователь не нажимал их раньше, а у владельца siteurl еще остались кредиты ...

Вот моя база данных:

USER:
id
username
password
credits
active
clicks

SITES:
id
userid
title
siteurl
clicks 
active 
weight

CLICKS:
id
siteid
byuserid

Я пытался с этим запросом MySql:

include('db_con.php');
mysql_connect("$dbhost", "$dbusername", "$dbpassword")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$qrym = mysql_query("SELECT * FROM `users` WHERE username='$username' LIMIT 1") or die (mysql_error()); 
  while($mem = mysql_fetch_object($qrym)){
    $uid = $row->id;
  }

$qrys = mysql_query("SELECT * FROM sites, clicks WHERE clicks.byuserid != '$uid' and sites.userid != '$uid' and sites.active = '1' ORDER BY sites.weight DESC, sites.id DESC LIMIT 1") or die (mysql_error()); 
if(mysql_num_rows($qrys)!=0){
  while($row = mysql_fetch_object($qrys)){
    $title = $row->title;
    $siteurl = $row->siteurl;
    echo "$title $siteurl";
  }
} else {
echo "No more sites";
}

Нет ошибок, но, что бы я ни пытался, результат - больше никаких сайтов! Как правильно присоединиться к этому запросу?

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

Возможно сделать

while($row = mysql_fetch_object($qrym)){
    $uid = $row->id;

вместо

while($mem = mysql_fetch_object($qrym)){
    $uid = $row->id;
1 голос
/ 25 июля 2011

Вы, вероятно, хотите запрос, подобный следующему:

SELECT [the columns you need]
FROM sites
LEFT JOIN clicks ON clicks.siteid = sites.id 
  AND clicks.byuserid = [current user id]
WHERE sites.active = 1 AND clicks.id IS NULL
ORDER BY sites.weight DESC, sites.id DESC 
LIMIT 1

Как отмечалось выше, gpojd, вы должны ДОЛЖНЫ санировать свои входные данные, прежде чем использовать их в запросе.Исправьте код вашего первого запроса:

$qrym = mysql_query("SELECT * FROM `users` 
  WHERE username='" . mysql_real_escape_string($username) . "' LIMIT 1");
0 голосов
/ 25 июля 2011

При извлечении только одной строки, как это делает ваш первый запрос, абсолютно не требуется цикл while () для извлечения данных.

Вот и наблюдайте комментарии в блоке кода:

$qrym = mysql_query("SELECT * FROM `users` WHERE username='$username' LIMIT 1") or die (mysql_error());
while($mem = mysql_fetch_object($qrym)){
       ^^^--- you fetch into $mem
    $uid = $row->id;
            ^^^--- but try to retrieve from $row?
}

Попробуйте вместо этого:

$sql = "SELECT ...";
$qrym = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_assoc($qrym);
$uid = $row['uid'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...