Перейти к содержимому


Случайная строка с условием


Сообщений в теме: 9

#1 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 19:49

Возник вопрос по поводу вывода случайной строки с условием. Я хочу получить сначала отсортированный массив в котором будут содержатся строки в которых поле "незачет" будет равно нет. После чего мне необходимо выбрать случайную строку из этого массива и далее передать из этой строки поле "ФИО" в таблицу "Контрагенты" в поле "замена".

Я делаю так:

if (f3720 === "да")
  {
   $mas=data_select(46, '`f3720`=',нет);
   $query= "SELECT * FROM $mas ORDER BY RAND() LIMIT 1";
   $sql_result=sql_query($query);
   $row=sql_fetch_array($sql_result);
   $line['замена'] = $row['f1400'];
}
После этого кода таблица контрагенты стала показывать только id - значит я лезу куда-то не туда. Подскажите пожалуйста.


UPD: пытаюсь сделать разными способами:
$no === "нет";

if( f3720 === "да" )
{
$rec = "SELECT `f483`
		FROM ".DATA_TABLE."46
		WHERE `f3720`='".$no."'
		ORDER BY RAND() LIMIT 1";
$line['замена'] = "UPDATE ".DATA_TABLE."46
				   SET `f3710` = ($rec)";
}


Сообщение отредактировал CbCoder: 06 Июль 2014 - 13:43


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Июль 2014 - 14:19

Я вижу такой вариант алгоритма:
1. Обращаетесь запросом к нужной таблице с условием "поле незачёт равно нет", проходите циклом while по всем полученным строкам и помещаете их в массив строк.
2. Получаете случайный элемент данного массива через функцию array_rand
3. Помещаете ФИО из данной строки в нужное вам поле.

Ваш же код я даже обсуждать не буду, т.к. там "бред на бреде сидит и бредом погоняет", извините за прямоту. Даже с точки зрения синтаксиса там сплошные ошибки (см. справочник по PHP).

#3 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 06 Июль 2014 - 15:07

По вашему алгоритму вот что смог составить:

$res = data_select(46, "`status`=0 AND `f3720`='нет'");
while ($row = sql_fetch_assoc($res))
{
$mas = data_select_array(46, "`status`=0");
}
$rand_row = array_rand($mas, 1);
$line['замена'] = $rand_row['f483'];

Посмотрите пожалуйста, в правильном направлении двигаюсь?

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Июль 2014 - 15:47

Направление правильное, но опять со странными прыжками не туда. Зачем внутри цикла снова делаете запрос? Вам же просто нужно занести результат вышенаписанного запроса в массив. Вот как должно быть:

$res = data_select(46, "`status`=0 AND `f3720`='нет'");
while ($row = sql_fetch_assoc($res)) // цикл чтения строк из запроса сверху, каждая строка читается в $row
{
  $mas[] = $row; // а тут помещаем очередной считанный $row в массив $mas как новый элемент этого массива
}
$rand_key = array_rand($mas, 1); // функция array_rand возвращает КЛЮЧ массива, а не элемент (см. описание функции)
$rand_row = $mas[$rand_row]; // поэтому чтобы получить элемент массива, нужно подставить полученный ключ
$line['замена'] = $rand_row['f483'];


#5 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 06 Июль 2014 - 16:08

Просмотр сообщенияCbCoder (06 Июль 2014 - 15:47) писал:

Направление правильное, но опять со странными прыжками не туда. Зачем внутри цикла снова делаете запрос? Вам же просто нужно занести результат вышенаписанного запроса в массив. Вот как должно быть:

$res = data_select(46, "`status`=0 AND `f3720`='нет'");
while ($row = sql_fetch_assoc($res)) // цикл чтения строк из запроса сверху, каждая строка читается в $row
{
  $mas[] = $row; // а тут помещаем очередной считанный $row в массив $mas как новый элемент этого массива
}
$rand_key = array_rand($mas, 1); // функция array_rand возвращает КЛЮЧ массива, а не элемент (см. описание функции)
$rand_row = $mas[$rand_row]; // поэтому чтобы получить элемент массива, нужно подставить полученный ключ
$line['замена'] = $rand_row['f483'];

Спасибо за ваши правки. теперь по идее должно работать, но опять загвоздка в том что поля разных типов. замена - тип пользователь, а ФИО тип текст и видимо поэтому поле обнуляется

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Июль 2014 - 16:35

Ну да, поля должны быть одного типа.

#7 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 06 Июль 2014 - 16:44

видимо я что-то еще упустил - создал поле "теккст" типа текст и туда тоже никак не хочет добавлять

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 761 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 06 Июль 2014 - 16:58

Возможно ошиблись где-то с именами или номерами полей. Проверьте код.

#9 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 06 Июль 2014 - 17:18

Вот код для того поля. поле f3720 - тип список - это может иметь значение?
все поля выставлены правильно, даже не знаю уже в чем может быть проблема.
$res = data_select(46, "`status`=0 AND `f3720`='нет'");
while ($row = sql_fetch_assoc($res)) // цикл чтения строк из массива сверху, каждая строка читается в $row
{
  $mas[] = $row; // а тут помещаем очередной считанный $row в массив $mas как новый элемент этого массива
}
$rand_key = array_rand($mas, 1); // функция array_rand возвращает КЛЮЧ массива, а не элемент (см. описание функции)
$rand_row = $mas[$rand_row]; // поэтому чтобы получить элемент массива, нужно подставить полученный ключ
$line['теккст'] = $rand_row['f483'];


#10 aleks.goodcolor

    Активный участник

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 06 Июль 2014 - 17:29

$rand_row = $mas[$rand_key]; тут ошибка была

Спасибо за помощь, на текстовом поле заработало. Буду искать теперь дальнейшее решение.





Количество пользователей, читающих эту тему: 8

0 пользователей, 8 гостей, 0 анонимных