Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6806-й день

Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua

 Вопросы по PHP

Glavar
Dec 12 2010, 20:35
  
Пост #1



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


Доброго время суток!
1. Скажите как мне обрезать первых 7 знаков, а остальные занести в базу?
2. У меня есть максимальное число голосов припустим 50, как мне присвоить ему 1 место
15 глосов - 5 место
43 голоса - 2 место
28 голосов - 3 место
24 - 4 место и т.д. и что бы место записывалось и обновлялось автоматически в базе данных?

Тема для обговорення мови програмування PHP, всі сторонні коментарі будуть видалятися, а їх автори отримувати %

Сообщение отредактировал BoyKot - Feb 3 2011, 13:22
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
20 Страницы   1 2 3 > »   
Reply to this topicStart new topic
Ответов(1 - 19)
Dr.HeadShot
Dec 12 2010, 20:50
  
Пост #2



Репутация:   23  
Дух


Группа: Пользователи
Сообщений: 63
С нами с: 29-July 07


1. substr("abcdefghijklmnop", 7);
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Meliora
Dec 13 2010, 0:19
  
Пост #3


Незарегистрированный







SELECT *
FROM <table>
ORDER BY <голоса> DESC
Go to the top of the page
+Quote Post
Glavar
Dec 13 2010, 17:59
  
Пост #4



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


(Meliora @ Dec 13 2010, 0:19) Перейти к цитате

SELECT *
FROM <table>
ORDER BY <голоса> DESC

Это просто сортировка. а мне сделать что припустим человек хочет узнать на котором он месте и ему не нужно искать в таблице(что написано выше) а сразу показать, что он на такомто месте
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
reiten
Dec 13 2010, 18:44
  
Пост #5



Репутация:   229  
Cтаршой
**

Группа: Пользователи
Сообщений: 813
С нами с: 16-January 08


SELECT COUNT(*)
FROM <table>
WHERE votes <= (SELECT votes FROM <table> WHERE id=<target_id>)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 13 2010, 18:59
  
Пост #6



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


(reiten @ Dec 13 2010, 18:44) Перейти к цитате

SELECT COUNT(*)
FROM <table>
WHERE votes <= (SELECT votes FROM <table> WHERE id=<target_id>)

В этом коде я так понимаю можно придать 1 значение, а если там сотни?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Нурик Сакура
Dec 14 2010, 10:04
  
Пост #7



Репутация:   76  
Cтаршой
**

Группа: Пользователи
Сообщений: 695
С нами с: 19-February 07


(Glavar @ Dec 12 2010, 20:35) Перейти к цитате
2. У меня есть максимальное число голосов припустим 50, как мне присвоить ему 1 место
15 глосов - 5 место
43 голоса - 2 место
28 голосов - 3 место
24 - 4 место и т.д. и что бы место записывалось и обновлялось автоматически в базе данных?
Все телепаты уехали на зимние каникулы, потому распиши, будь добр, подробнее, где у тебя есть максимальное число голосов и как ты хочешь присвоить. Где у тебя хранятся пользователи и как они связаны с голосами?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 14 2010, 15:14
  
Пост #8



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


Есть таблица:
id name text golosa mesto
1 test1 text1 15
2 test2 text2 43
3 test3 text3 74
4 test4 text4 12
....

и в поле "место" надо что база сама вводила 1 место = максимальное (в нашем случае 74), 2 место = 43, 3 место = 15, 4 место = 12 и т.п. И при изминении у id 2 и id 3 менялись места автоматически и т.п.

А на сайте вывести
$con = mysql_query("SELECT * FROM таблица);
$wr_con = mysql_fetch_array($con);
printf("Тема %s, <br> Текст: %s<br> Голосов: %s<br> Тема на %s месте",$wr_con['name'],$wr_con['text'],$wr_con['golosa'],$wr_con['mesto']);


Примерно это
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Dreyk
Dec 14 2010, 15:53
  
Пост #9



Репутация:   120  
Постоялец
***

Группа: Пользователи
Сообщений: 1 305
С нами с: 13-October 06


Если ты хочешь сделать это на стороне базы автоматически - то нужны триггеры.
Но если проект хоть сколько-нибудь большой, это замучает мускуль. Легче всего делать это кроном, к примеру, раз в 4-5 минут: сортировать список по голосам и проставлять им всем новые места

Сообщение отредактировал Dreyk - Dec 14 2010, 15:54
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 14 2010, 16:08
  
Пост #10



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


ну 4-5 минут - это супер. Только как сделать?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Dreyk
Dec 14 2010, 16:12
  
Пост #11



Репутация:   120  
Постоялец
***

Группа: Пользователи
Сообщений: 1 305
С нами с: 13-October 06


вначале шлешь
SELECT @PLACE := 0;

а потом
UPDATE `table`
SET
    `table`.`mesto` = (@PLACE := @PLACE +1)
ORDER BY
    `table`.`golosa` DESC;


как-то так

Сообщение отредактировал Dreyk - Dec 14 2010, 16:13
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 14 2010, 16:26
  
Пост #12



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


(Dreyk @ Dec 14 2010, 16:12) Перейти к цитате

вначале шлешь
SELECT @PLACE := 0;

а потом
UPDATE `table`
SET
    `table`.`mesto` = (@PLACE := @PLACE +1)
ORDER BY
    `table`.`golosa` DESC;


как-то так

Это в начале страницы я так понимаю, да?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Dreyk
Dec 14 2010, 16:37
  
Пост #13



Репутация:   120  
Постоялец
***

Группа: Пользователи
Сообщений: 1 305
С нами с: 13-October 06


Это в скрипте, который будет вызываться cron'ом раз в 5 минут

Если слово крон ни о чем не говорит - иди вот http://forum.0day.kiev.ua/index.php?showtopic=205958 почитай

Сообщение отредактировал Dreyk - Dec 14 2010, 16:41
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 14 2010, 18:23
  
Пост #14



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


Так этот скрипт в индекс кидать или в отдельный файл? и как крон запустить? и как записать в php или html?
Почитал и сделал код */5 * * * * /file/database.php
а куда его вставить?
php.su говорит: "Разумеется, ваш сервер должен быть типа Unix, а не Windows."

Сообщение отредактировал Glavar - Dec 14 2010, 19:10
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
R_E_W
Dec 14 2010, 21:29
  
Пост #15



Репутация:   6  
Дух


Группа: Пользователи
Сообщений: 46
С нами с: 5-April 08


Зачем человека мучать тригерами и кроном.
К тому же если в таблице будет 1000 записей, раз в 5 минут все апдейтить? ужс.
А если в таблице будет 10000 записей, а если 100000?

Я так понял нужно отображать общий отсортированный список с указанием места и количества голосов и чтоб у каждого юзера была возможность посмотреть где-то там у себя в статистике какое у него сейчас место среди учавствующих. Если так то вон жеж человек посоветовал отличный запрос

SELECT COUNT(*)
FROM <table>
WHERE votes <= (SELECT votes FROM <table> WHERE id=<target_id>)

его только нужно под себя переделать немного.

В вашей таблице должно быть еще поле по которому осуществлять поиск, user_id к примеру или еще чего (оно должно быть уникально). Подставляем, немного поправляем запрос и получаем вывод места для одного пользователя

SELECT COUNT( * )
FROM <table>
WHERE votes >= (
SELECT votes
FROM <table>
WHERE user_id = <user_id> )

Вместо <user_id> подставляем айди юзера для которого хотим вычислить позицию.

Для отображения же общего списка юзаем order by
SELECT *
FROM <table>
ORDER BY votes DESC

Т.к. результаты в любом случае будут обрабатываться в цикле, ничто не мешает добавтить в цикл переменную которая будет отвечать за место. К примеру

<?php
$sql = 'SELECT *
FROM user_votes
ORDER BY votes DESC';
$results = mysql_query($sql);

$place = 1;
while ($row = mysql_fetch_assoc($results)) {

echo "{$place}) User {$row['user_id']} with {$row[votes]} votes<br>";
$place++;
}
?>

как-то так. Не нужно никаких кронов триггеров и работать будет в разы быстрее. А на больших таблицах очень ощутимо быстрее.

Сообщение отредактировал R_E_W - Dec 14 2010, 21:33
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 14 2010, 21:54
  
Пост #16



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


(R_E_W @ Dec 14 2010, 21:29) Перейти к цитате

Зачем человека мучать тригерами и кроном.
К тому же если в таблице будет 1000 записей, раз в 5 минут все апдейтить? ужс.
А если в таблице будет 10000 записей, а если 100000?

Я так понял нужно отображать общий отсортированный список с указанием места и количества голосов и чтоб у каждого юзера была возможность посмотреть где-то там у себя в статистике какое у него сейчас место среди учавствующих. Если так то вон жеж человек посоветовал отличный запрос

его только нужно под себя переделать немного.

В вашей таблице должно быть еще поле по которому осуществлять поиск, user_id к примеру или еще чего (оно должно быть уникально). Подставляем, немного поправляем запрос и получаем вывод места для одного пользователя

SELECT COUNT( * )
FROM <table>
WHERE votes >= (
SELECT votes
FROM <table>
WHERE user_id = <user_id> )

Вместо <user_id> подставляем айди юзера для которого хотим вычислить позицию.

Для отображения же общего списка юзаем order by
SELECT *
FROM <table>
ORDER BY votes DESC

Т.к. результаты в любом случае будут обрабатываться в цикле, ничто не мешает добавтить в цикл переменную которая будет отвечать за место. К примеру

<?php
$sql = 'SELECT *
FROM user_votes
ORDER BY votes DESC';
$results = mysql_query($sql);

$place = 1;
while ($row = mysql_fetch_assoc($results)) {

echo "{$place}) User {$row['user_id']} with {$row[votes]} votes<br>";
$place++;
}
?>

как-то так. Не нужно никаких кронов триггеров и работать будет в разы быстрее. А на больших таблицах очень ощутимо быстрее.



Большое спс, завтра попробую. Надеюсь все ок будет. Я сам в пхп недавно. умею вытащить, вставить, отсортировать, обновить только. Еще раз спс большое и звиняете за ошыбки, в русс не силен
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 16 2010, 23:26
  
Пост #17



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


Код работает. на 9о %. пока что не разобрался, почему он поглощает максимальное значение и выводит следуишие.
Я про этот код:
<?php
$sql = 'SELECT *
FROM user_votes
ORDER BY votes DESC';
$results = mysql_query($sql);

$place = 1;
while ($row = mysql_fetch_assoc($results)) {

echo "{$place}) User {$row['user_id']} with {$row[votes]} votes<br>";
$place++;
}
?>


Таблица где идет подсчет голосов
Open in new window

Сообщение отредактировал Glavar - Dec 16 2010, 23:31
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
artishok
Dec 17 2010, 13:53
  
Пост #18



Репутация:   807  
follow the music
*****

Группа: Пользователи
Сообщений: 5 125
С нами с: 31-December 06


del

Сообщение отредактировал паZитифф - Dec 17 2010, 13:54
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Glavar
Dec 17 2010, 17:18
  
Пост #19



Репутация:   10  
Активист
*

Группа: Пользователи
Сообщений: 375
С нами с: 11-May 08


При написании:
SELECT COUNT( * ) FROM <table> WHERE votes >= (SELECT votes FROM <table>WHERE user_id = <user_id> )


$test = mysql_query("SELECT COUNT(golosa) FROM music WHERE golosa >= (SELECT golosa FROM music WHERE login = 'Glavar' ");
                        $row_tes = mysql_fetch_array($test);

Дало ошыбку:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\AppServ\www\contest\index.php on line 215

Сообщение отредактировал Glavar - Dec 17 2010, 17:19
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
AnNE DoM.ini
Dec 17 2010, 17:23
  
Пост #20



Репутация:   173  
Постоялец
***

Группа: Пользователи
Сообщений: 1 412
С нами с: 30-June 07



$test = mysql_query("SELECT COUNT(golosa) FROM music WHERE golosa >= (SELECT golosa FROM music WHERE login = 'Glavar') ");

$row_tes = mysql_fetch_array($test);
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

20 Страницы   1 2 3 > » 
Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 1st November 2024 - 15:15
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст.