Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Циклы в PHP
maax  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 3 месяца, 29 дней
Карма:




Был вот такой код в одном файле index.php который брал из таблицы test записи и выводил их в цикле, в этой же таблице хранится ид юзера который оставил эту запись ,по этому иду делал второй запрос в таблицу users что бы получить имя аватарку и т д

вот старый код который вроде бы работал как надо

<?php
$datesite = date("Y-m-d H:i:s");
$result = $cnt->prepare("SELECT * FROM test where `datetime` >= ? ORDER BY id DESC");
$result->bindParam(1, $datesite);
$result->execute();
while($myrow = $result->fetch())
{
$text = htmlspecialchars(stripslashes($myrow['text']));

$posterid = $myrow['posterid'];

$users = $cnt->prepare("SELECT * FROM users WHERE id = ?");
$users->bindParam(1, $posterid);
$users->execute();
$usersres = $users->fetch();

$name = htmlspecialchars(stripslashes($usersres['name']));

?>

<div class="text"><?php echo $text ?></div>
<
div class="name"><?php echo $name ?></div>
<?php } ?>


и вот наткнулся на то что щас лучше все запросы писать через ООП ,все хранить в одном файле, создал class.php и начал туда все переносить

и получилось что то типо того


namespace Auth;

class User
{
public function test()
{
$datesite = date("Y-m-d H:i:s");

$result = $this->db->prepare("SELECT * FROM test where `datetime` >= ? ORDER BY `datetime`");
$result->bindParam(1, $datesite);
$result->execute();

return $result;
}


public function users()
{
$test = $this->test();
$result = $test->fetch();
$posterid = $result["posterid"];

$users = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$users->bindParam(1, $posterid);
$users->execute();

return $users;
}
}



а в тот же index.php получился вот такой код

<?php
$glclass = new Auth\User;
$test = $glclass->test();

while($myrow = $test->fetch())
{
$text = htmlspecialchars(stripslashes($myrow['text']));


$users = $glclass->users();
$usersres = $users->fetch();

$name = htmlspecialchars(stripslashes($usersres['name']));
?>

<div class="text"><?php echo $text ?></div>
<
div class="name"><?php echo $name ?></div>
<?php } ?>


он так же выводит все в цикле но уже не хочет показывать аватарки и имя юзеров иды которых указаны в таблице test ,если я там любые иды буду писать в ручную он выводит все записи под именем одного и того же юзера, допустим вывел он 2 записи которые написал я и мой друг, но почему то имя везде только мое, в первом варианте все работало ,не могу найти ошибку
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 4 дня
Карма: 77




Зачем делать два запроса, если это можно сделать в один ?
Всего-то, нужно использовать LEFT JOIN или INNER JOIN
$sql = "
SELECT
t.*,
u.name /* и далее что ещё нужно, аватарку , дату регистрации и т.д. */
FROM
`test` AS t
INNER JOIN
`users` AS u ON u.id = t.posterid
WHERE
`datetime` >= ?
ORDER BY
`datetime`
"
;
$result = $this->db->prepare($sql);
$result->bindParam(1, $datesite);

Если в таблицах есть одинаковые названия полей, то используй Алиасы для переименования. Вот примерно так
u.name AS user_name
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 4 дня
Карма: 77




Метод user можно оставить, может тебе понадобится вытащить информацию по пользователю. Только стоит дополнить передачей параметра (массива).
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 4 дня
Карма: 77




Цитата
создал class.php
Если это название файла - так лучше не делать.
А называть файл по имени класса, и добавить в конце class

user.class.php


Во первых сразу видно, что внутри файла находится класс.
Во вторых, такой класс уже можно подключать через автозагрузку.
spl_autoload_register('my_autoloader');

// Функция автозагрузки файла класса, из папки class
function my_autoloader($class) {
include 'class/' . strtolower($class) . '.class.php';
}
И не нужно иклудить каждый файл. Достаточно объявить класс .
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 3 месяца, 29 дней
Карма:




Kusss

Да так действительно проще,спс, и кстати зачем когда в SELECT выбираешь что надо нужно ставить u. ? первый раз такое вижу,наверно нубский вопрос biggrin.gif

это типо спец. для 2х таблиц?

Это сообщение отредактировал maax - 6.10.2016 - 14:50
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 4 дня
Карма: 77




u в данном примере - это Алиас (Псевдоним) таблицы users.
Алиасы могут быть не только у таблиц, но и скажем у подзапросов.
посмотри эту тему http://phpforum.su/index.php?showtopic=50424&st=0

Можно писать без сокращений, и запрос будет выглядеть вот так
$sql = "
SELECT
`test`.*,
`users`.name
FROM
`test`
INNER JOIN
`users` ON `users`.id = `test`.posterid
WHERE
`test`.`datetime` >= ?
ORDER BY
`test`.`datetime`
"
;
По сути это сокращение кода, и повышение читабельности.

ещё Алиас можно указывать без AS. Но по мне так хуже.
INNER JOIN
`users` s ON s.id = t.posterid
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1355
Пользователь №: 28976
На форуме: 5 лет, 4 месяца, 4 дня
Карма: 77




Цитата
зачем когда в SELECT выбираешь что надо нужно ставить u. ?

Если у тебя выборка идет через несколько таблиц, желательно указывать из какой таблицы берутся данные.

Не советую писать * (звездочку) повсеместно. Чем больше ты запрашиваешь данных - тем больше сервер потребляет памяти. Это мелочь кажется, но когда у тебя много запросов или ты запросил НУ очень много данных, скорость работы скрипта сильно увеличится.
Да и ВСЕ данные, как правило нужны в единичных случаях.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maax  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 92
Пользователь №: 41664
На форуме: 1 год, 3 месяца, 29 дней
Карма:




Kusss
okay понял,спасибо
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса