Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Выборка и склеивание значенией из БД
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Выборка и склеивание значенией из БД

Страниц (1): [1]
 

1. phillip - 21 Марта, 2009 - 11:02:28 - перейти к сообщению
Здравствуйте! Улыбка
такой вопрос.... у меня есть таблица sites в ней три поля: id, content, active, used. Мне нужно случайным образом взять три строки со значениями, и на выходе получить переменную, которая будет содержать как бы content сразу трех сайтов.... и для каждой строки которую мы брали, used сделать равной единице. Ну то есть типа эту мы использовали.
2. Champion - 21 Марта, 2009 - 14:09:11 - перейти к сообщению
select first 3 ... order by rand(); // взяли
потом fetch это в массивы id и content;
потом $content = implode('', $content);
потом $id = implode(', ', $id);
потом "update ... set used = 1 where id in ($id)"
3. phillip - 21 Марта, 2009 - 15:38:01 - перейти к сообщению
СПАСИБОО!!! буду пробовать
4. phillip - 22 Марта, 2009 - 15:30:24 - перейти к сообщению
пока что не получается.... Подскажите как правильно должно быть, пожалуйста
CODE (text):
скопировать код в буфер обмена
  1. $link = Connect2DB();
  2. $query = "SELECT COUNT(3) FROM `sites` WHERE `used`='N'";
  3. $result = mysql_query($query,$link) or die(mysql_error()."<br />\n".$query);
  4. $rez = mysql_fetch_assoc($result);
  5. $d = implode(",", $rez['content']);
  6. echo $d;

Выдает такую ошибку:
Warning: implode() [function.implode]: Invalid arguments passed
Огорчение
5. Champion - 22 Марта, 2009 - 16:34:31 - перейти к сообщению
Во-первых, http://php.net/manual/ru/function.implode.php
Во-вторых, что ты пытаешься сделать этим запросом?
6. phillip - 22 Марта, 2009 - 16:49:59 - перейти к сообщению
http://www.php.su/functions/?implode я ориентировался сюда)
>>что ты пытаешься сделать этим запросом?
этим запросом я счас пробую из таблицы sites достать три строки, и три поля 'content' соеденить в одно. для примера:

Таблица sites
id content active used
1 nokia 1 N
2 motorola 1 N
3 samsung 1 N
4 telefon21 1 N


Хочу получить строку 'nokia, motorola, samsung'
а уж потом N у трех строк сменить на Y
7. Champion - 23 Марта, 2009 - 09:28:28 - перейти к сообщению
Ладно. Функция implode вторым аргументом принимает массив. Во вторых, чтобы выбрать 3 строки, надо писать в запросе SELECT FIRST 3 или SELECT ... LIMIT 3.
8. phillip - 23 Марта, 2009 - 20:50:52 - перейти к сообщению
спасибо, дождался вперед ответа на другом форуме)
9. Roman - 24 Марта, 2009 - 06:37:19 - перейти к сообщению
тем не менее попробуйте использовать прилагаемую библиотеку

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //как водится не доконца ясна постановка задачи, ну например непонятно поле
  4. //used после показа должно иметь значение 1 (то есть более вы никогда его не
  5. //намерены показывать) или его значение должно увеличиваться на одну единицу
  6. //и теперь, предположим, к показу этого поля можно будет вернуться после то-
  7. //го как будут показаны все поля с "меньшим приоритетом"
  8. //(меньшим показ-лем used)...ну, исходим из того, что, все же, показы будут
  9. //неоднократными
  10.  
  11.   class SelectThreeRows{
  12.           static $count;
  13.           static $level;
  14.          
  15.          
  16.           //вызываем функцию с параметром: "кол-во нужных строк" ($summ)
  17.           //переменная $level указывает какое значение used считается "непоказанным"
  18.           //ее можно задать и явно, но вообщето если функция не обнаружит ни одной
  19.           //записи с таким уровнем она автоматически прибавит единицу и "пойдет по
  20.           //второму кругу" и так будет прибавлять по единице пока не обнаружит мини-
  21.           //мальный уровень который и посчитает "непоказанным", так что об этом можно
  22.           //незаботиться
  23.          
  24.           static function SelectinThreeRows($summ,$level=0){
  25.                         //получаем весь список строк с требуемым
  26.                         //значением поля used
  27.                         self::$level=$level;
  28.                         //функция выбирающая все "непоказанные" записи
  29.                         //расположена на строке 91
  30.                    $massa=self::SelectAllRows();
  31.  
  32.                    self::$level+=1;
  33.  
  34.  
  35.                   //в эту переменную будет помещена "выходная строка",
  36.                   //ну, то есть результат
  37.                   $content="";
  38.           //если общее кол-во непо-ных записей больше трех...
  39.                           if (self::$count>$summ){
  40.                                   //выбираем три НЕОДИНАКОВЫХ случайных числа
  41.                                   for($a=0;count($num)<3;$a=mt_rand(1,(self::$count-1)),$num[$a]=$a);
  42.                                                                                
  43.                                   //далее выбираем строки равные значениям этих чисел
  44.                                  
  45.  
  46.                                           foreach($num as $nm){
  47.                                                  
  48.                                                   //формируем выходную строку...
  49.                                                   $content.=mysql_result($massa,$nm,"content").", ";
  50.                                                   $id=mysql_result($massa,$nm,"id");
  51.                                                  
  52.                                                   //изменяем значение поля used в таблице
  53.                                                   mysql_query ("
  54.                                                   UPDATE sites
  55.                                                   SET used=".self::$level."
  56.                                                   WHERE id=".$id
  57.                                                   ) or die ("Ошибка запроса:".
  58.                                                   "
  59.                                                   UPDATE sites
  60.                                                   SET used=".self::$level."
  61.                                                   WHERE id=$id".
  62.                                                   mysql_error());
  63.                                           }
  64.                                    //возвращаем полученную строку
  65.                                    
  66.                                    return $content;
  67.           //если же кол-во непоказывавшихся записей меньше или равно 3...        
  68.                           }else{
  69.                                   //...то, просто сразу передаем их последовательно в
  70.                                   //выходную строку
  71.                                   for($content="";$row=mysql_fetch_assoc($massa);){
  72.                                                 $content.=$row['content'].", ";
  73.                                                 $id=$row['id'];
  74.                                   //и естественно меняем их значения used  в таблице
  75.                                                
  76.                                                 mysql_query ("
  77.                                                   UPDATE sites
  78.                                                   SET used=".self::$level."
  79.                                                   WHERE id=$id
  80.                                                   ") or die ("Ошибка запроса:".mysql_error());
  81.                                  
  82.                                   }
  83.                                   return $content;
  84.                           }
  85.                  
  86.                  
  87.          
  88.           }
  89.                    //приходится сначала выбирать все непоказанные записи
  90.                   //так как на этапе выборки мы не можем случайным образом
  91.                   //выбирать только записи с used=0
  92.           static function SelectAllRows(){
  93.                  
  94.           $massa=mysql_query(
  95.                   "SELECT
  96.                   id, content
  97.                   FROM sites
  98.                   WHERE used=".self::$level."
  99.                   ")or die ("Ошибка запроса:".mysql_error());
  100.                   //определяем общее кол-во записей непоказанных строк
  101.                   //для указания в генераторе "верхнего уровня" выборки
  102.                   self::$count=mysql_num_rows($massa);
  103.                   //если ненайдено ни одного поля с удов-щим
  104.                    //условием увеличиваем параметр used на единицу и
  105.                    //перевызываем функцию заново (пошли на
  106.                    //второй круг, так сказать :0))
  107.                   if(self::$count==0){
  108.                                 self::$level+=1;
  109.                         //здесь функция вызывает сама себя до
  110.                         //тех пор пока не получит удов. результата     
  111.                                 $massa=self::SelectAllRows();
  112.                    }
  113.                    
  114.                   return $massa;
  115.           }
  116.   }
  117. ?>
  118.  
  119.  


ее можно скопировать в файл, назвать его например: "SelectThreeRows.php".

в этом случае (и при том, что он будет расположен в директории исполняемой программы)
синтаксис ее подключения будет следующим:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.   require_once "SelectThreeRows.php";
  4.   $result=SelectThreeRows::SelectinThreeRows(2);
  5.  
  6. ?>
  7.  
  8.  


перед этим конечно должно быть выполненно подключение к БД

В параметрах вам нужно передать только лишь количество требуемых записей для
выборки, вы указывали три, но библиотека построена так, что их кол-во можно изменять.
Вообще в этой задачке есть некторые "подводные камни", я постарался их учесть.Если попробуете, или будет что нибудь непонятно - отпишитесь. Отвечу.
(Добавление)
ну, как обычно ошибочка есть в строке 40 надо исправить цифру 3 не переменную $summ, а то работать будет "неровно".

 

Powered by ExBB FM 1.0 RC1