PDA

Показать полную графическую версию : [решено] $_GET['']


Artem-Samsung
05-03-2008, 23:46
Вообщем написал я скрипт для того, что бы картинка менялась для каждого подраздела.
Но написать красиво я не смог, написал таким образом, что этот код нужно раз двадцать дублировать для разных разделов
у меня там actors, books, films

Система моя меню и подменю такая:
Например для раздела актеров
(В адресной строке)
?hp = actors //главный раздел
?actors=daniel //подраздел


<?php

if (isset($_GET['actors'])){
$submenupic1 = $_GET['actors'];
}else if(isset( $_GET['hp']) && $_GET['hp']=="actors") {
$submenupic1 = $_GET['hp'];
}else{
$submenupic1 = false;
}
if($submenupic1){
echo '<img src="';
echo "images/design/submenupics/".$submenupic1.".jpg";
echo ' " alt="" width="300" height="100" />';
}
?>


Хотелось бы сделать это все более универсальным, то есть значение actors в коде заменить на переменную, которая будет то book то films и так далее.
Сделаю переменную:$hp
$hp = array_keys($_GET);
Которую пропишу везде вместо акторс


<?php

$hp = array_keys($_GET);

if (isset($_GET['$hp[0]'])){
$submenupic1 = $_GET['$hp[0]'];
}else if(isset( $_GET['hp']) && $_GET['hp']=="$hp[0]") {
$submenupic1 = $_GET['hp'];
}else{
$submenupic1 = false;
echo "error <br>";
echo $hp[0];
}
if($submenupic1){
echo '<img src="';
echo "images/design/submenupics/".$submenupic1.".jpg";
echo ' " alt="" width="300" height="100" />';
}
?>

Выводит же на экран:
error
actors

То есть переменная помещает в себя правильну инфу, но возможно ошибка в участке кода типа:
$submenupic1 = $_GET['$hp[0]'];

Vlad Drakula
05-03-2008, 23:50
$submenupic1 = $_GET[$hp[0]]; - пробовал?

в чем разница между одинарными и двойными кавычками в PHP?

Artem-Samsung
05-03-2008, 23:54
Чудеса!!!! )) Заработало:


$hp = array_keys($_GET);

if (isset($_GET[$hp[0]])){
$submenupic1 = $_GET[$hp[0]];
}else if(isset( $_GET['hp']) && $_GET['hp']==$hp[0]) {
$submenupic1 = $_GET['hp'];
}else{
$submenupic1 = false;
echo "error <br>";
echo $hp[0];
}
if($submenupic1){
echo '<img src="';
echo "images/design/submenupics/".$submenupic1.".jpg";
echo ' " alt="" width="300" height="100" />';
}



В моем понимании - разницы между одинарными и двойными нету. Но исползуют разные кавычки для того, что бы они в срединке не пересекались. То есть
printf ("asdasd asdasdads 'asdasdasd' ", sd); Внешние - двойные - внутри одинарные

DedAlex
06-03-2008, 00:02
Artem-Samsung, в двойных кавычках переменные парсятся а в одинарных нет. Например код$i=100;
echo "$i";
echo '$i'; выдаст 100$i

Artem-Samsung
06-03-2008, 18:23
Спасибо. А не подскажете еще чуть-чуть?
Вообщем мне нужно заполнить одномерный массив значениями $menu1:


$result = mysql_query("SELECT DISTINCT title, link, category FROM menu", $db);
$categ = mysql_fetch_array($result);

for ($i=0 , $sum=0 ; $categ = mysql_fetch_array($result); $i++ ) {
$menu1[]=$categ['category'];
}

print_r ($menu1);


Вроде бы все правильно, но получается фигня:
Array ( [0] => Література [1] => Література [2] => Література [3] => Кінофільми [4] => Кінофільми [5] => Кінофільми [6] => Азиев [7] => Кінофільми [8] => Комп.Ігри [9] => Комп.Ігри [10] => Комп.Ігри [11] => UA HPclub [12] => UA HPclub [13] => UA HPclub [14] => UA HPclub [15] => Спілкування [16] => Спілкування [17] => Спілкування [18] => Спілкування )

Как бы у меня там в БД много раз повторяется как Литература так и Кинофильмы, но я же написал DISTINCT чаво оно не работает. То есть мне нужно что бы значения не повторялись в массиве.

Coutty
06-03-2008, 20:48
for ($i=0 , $sum=0 ; $categ = mysql_fetch_array($result); $i++ ) {
if (!in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
}

Artem-Samsung
06-03-2008, 21:47
ухты какая загогулина. Я даже не знаю, как это озвучить О.о
if (!in_array($categ['category'], $menu1))
Но спасибо, попробую ща

Coutty
06-03-2008, 22:05
Да всё просто. Проверка: если значения $categ['category'] в массиве $menu1 ещё нет, значит записываем его туда. Иначе побоку.

Artem-Samsung
07-03-2008, 13:27
Большое спасибо, со своей задачей скрипт справляется, но таки выводится на экран ошибка:

Notice: Undefined variable: menu1 in z:\home\localhost\www\uahpclubphp\test.php on line 9
[Денвер: показать возможную причину ошибки]
Warning: in_array(): Wrong datatype for second argument in z:\home\localhost\www\uahpclubphp\test.php on line 9
Array ( [0] => Література [1] => Кінофільми [2] => фывфыв [3] => Комп.Ігри [4] => UA HPclub [5] => Спілкування )

В строке if (!in_array($categ['category'], $menu1))
То есть как бы не существует еще эта переменная, а мы ее проверяем.
Я пробовал прописать ей в начале значение ноль, но все равно не получается.
Единственным выходом является добисать еще одно условие:

if (isset($menu1)) {
if (!in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
}

Хотя нет, та штука не получается так как меню1 изначально и не должно было быть... эх.. запутался

А, и ее вопрос. Вы так как то интересно записали условие if без кавычек фигурных, нигде не втречал такого. Когда можна эти кавычки не ставить, я то уверен, что не во всех случаях без кавычек сработает

Ухтышка, нашел способ еще один:
сделать выборку таким вот образом:
$result = mysql_query("SELECT DISTINCT category , title, link FROM menu GROUP BY category", $db);
И все получается, без дополнительно условия. Но все же вариант с усовием мне тоже интересен.

Просто прописав таким образом выбока оно как-то перемешалось:
Точнее упорядочилось по алфавиту

Array ( [0] => Комп.Ігри [1] => Кінофільми [2] => Література [3] => Спілкування )

Да и UA HPclub ячейка пропала

Coutty
07-03-2008, 14:59
Artem-Samsung, я не понял, в этом сообщении содержится вопрос или уже нет?)) Вот кроме этого:
Вы так как то интересно записали условие if без кавычек фигурных, нигде не втречал такого. Когда можна эти кавычки не ставить, я то уверен, что не во всех случаях без кавычек сработает »
После if, else, for и подобных исполняется один блок кода. Блок кода в данном случае - это либо одна команда, либо набор команд, заключённый в фигурные скобки. Т.е. для одной строчки можно не ставить скобки)но таки выводится на экран ошибка: »
Там не ошибка, а уведомление и предупреждение)

if (isset($menu1)) {
if (!in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
}
это можно покомпактнее записать:
if (isset($menu1) && !in_array($categ['category'], $menu1))
$menu1[]=$categ['category']; Я пробовал прописать ей в начале значение ноль, но все равно не получается. »
Каким образом? $menu1 = 0; ? Так не выйдет) Можно так: $menu1[0]="0"; reset($menu1); (т.е. сбрасываем внутренний указатель в массиве на начало).
Или вот так: $menu1 = new Array(); (беру по аналогии с JavaScript'ом - не знаю, работает ли это в PHP).

Artem-Samsung
08-03-2008, 00:54
Coutty, respect !!!
Огромное спасибо, докладно пояснили все.. просто замечательно.
Но вот прописав такое - $menu1[0]="0"; reset($menu1); все равно глюк - первый элемент массива нулу равняется(
$menu1 = new Array(); - воооще не работает.
Но не беда. Я начал цикл со значения 1. И на самом начале прописал первому элемента массива первый элемент того массива из БД )
$menu1[0] = $categ['category'];


<?
include ('config.php');
$result = mysql_query("SELECT DISTINCT category , title, link FROM menu", $db);
$categ = mysql_fetch_array($result);

$menu1[0]=$categ['category'];;
for ($i=1 , $sum=0 ; $categ = mysql_fetch_array($result); $i++ ) {
if (isset($menu1) && !in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
}
print_r ($menu1);

?>

Artem-Samsung
08-03-2008, 02:05
Эх...
Усовершенствовал немного. Сделал ду вайл да и в боевых условиях проверил ;)


<?php
include ('config.php');
$result = mysql_query("SELECT DISTINCT category FROM menu", $db);
$categ = mysql_fetch_array($result);

$i=0;
$menu1[0] = $categ['category'];
do {
printf ("<option value='$i'>%s</option>", $categ['category']);
if (isset($menu1) && !in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
$i++;
}
while ($categ = mysql_fetch_array($result));

print_r($menu1);

?>

Coutty
08-03-2008, 15:18
if (isset($menu1) && !in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
$i++;
Это не правильно) Тут две операции внутри блока if, поэтому надо ставить фигурные скобки)

$menu1[0] = $categ['category'];
do {
printf ("<option value='$i'>%s</option>", $categ['category']);
if (isset($menu1) && !in_array($categ['category'], $menu1))
$menu1[]=$categ['category'];
$i++;
}
while ($categ = mysql_fetch_array($result));
Это ведь не должно работать, нэ? Смотри, сначала присваиваешь нулевое значение в $menu1, но ведь $categ ещё не "отфетчена_аррэем". Далее идёт исполнение блока, но переменной $categ всё ещё нет. И лишь после этого используется mysql_fetch_array();
Что, если написать вот так:
$menu1[0] = 0;
while($categ = mysql_fetch_array($result)) {
if (isset($menu1) && !in_array($categ['category'], $menu1))
$menu1[$i]=$categ['category'];
printf ("<option value='$i'>%s</option>", $categ['category']); // этот кусок я тоже чуток не понял... Просто не в курсе, что оно делает:)
$i++;
}

Artem-Samsung
10-03-2008, 23:37
Это не правильно) Тут две операции внутри блока if, поэтому надо ставить фигурные скобки) »
Да там должно в ифе выполняться только первая операция) Потому вроде все ок.
Вообщем с menu1 все просто замечтально))

$result = mysql_query("SELECT DISTINCT `category` FROM `menu`", $db);
$categ = mysql_fetch_array($result);
$i = 0; $menu1[0] = $categ['category']; //категорії
do {
printf ("<option value='$i'>%s</option>", $categ['category']);
if (isset($menu1) && !in_array($categ['category'], $menu1)) $menu1[]=$categ['category'];
$i++;
} while ($categ = mysql_fetch_array($result));

Если интересно, то вся задумка - это вывод выпадающего меню. А программирую я селекты.
А вот меню2 у меня что-то вооще никак не получается (( Никак не хочет начинаться с нуля


$i=0;
$j=0;
$menu2[]=0;
do {
$result = mysql_query("
SELECT title, link FROM menu WHERE category = '$menu1[$i]'
", $db);
$menu = mysql_fetch_array($result);
do {
printf ("<option value='%s' class='%s'>%s</option>", $j, $i, $menu['title']);
$j++;
if (isset($menu2))
$menu2[$j]=$menu['link']; // пункти меню
}
while ($menu = mysql_fetch_array($result));
$i++;
}



Вывод такой:
Первое меню: Array ( [0] => Література [1] => Кінофільми [2] => Комп.Ігри [3] => UA HPclub [4] => Спілкування [5] => Адміністратору )
Второе меню: Array ( [0] => 0 [1] => rowling [2] => books [3] => bb [4] => fanfics [5] => films [6] => film6 [7] => actors [8] => photo [9] => adventure [10] => quidditch [11] => passing [12] => about [13] => projects [14] => prophet [15] => partners [16] => forum [17] => chat [18] => gallery [19] => blogs [20] => menu [21] => news )

Coutty
11-03-2008, 08:27
Ну так очевидно, что с нуля оно и не начнётся. Смотри: сначала вызываешь $j++; а потом уже $menu2[$j]=$menu['link']; Т.е. к моменту присваивания j=1. Переложи в конец блока do{}

Artem-Samsung
15-03-2008, 19:06
Спасибо большое! )) Аж стыдно) Конечно же счетчик должен включаться перед первым действием в цикле.

Я вот что бы новую тему не создавать таки осмелюсь в этой еще парочку вопросов задать.
К примеру:
После нажатия кнопки в форме у меня программа выполняет определенные действия:


<?php
if (isset($_POST['SelectMenu'])) {
$menu = $_POST['menu'];
}

// Дальше у меня появляется следующая форма после нажатие кнопки сабмит в предыдущей.
// И мне нужно использовать переменную $menu. Так как и в последующих формах.

if (isset($_POST['PreView'])){
echo $menu;
}
?>




Но почему то данные в переменной не сохраняются.
Почему? Ведь оно присваивалось в определенной функции, которая успешно выполнялась. То есть в этой:

if (isset($_POST['SelectMenu'])) {
$menu = $_POST['menu'];
}

Coutty
16-03-2008, 09:38
В начале скрипта выведи распечатку содержимого print_r($_POST); Посмотрим, может быть переменные по-другому размечены?:)

Но вообще я не понимаю зачем проверять каждый раз isset().
Может быть просто написать:
if($_POST['SelectMenu']) { // если переменная содержит ненулевое и непустое значение
$menu = $_POST['menu'];
}

Artem-Samsung
16-03-2008, 12:04
Я выкрутился применяя сессии ))) Все ок :))

Кстати, если интерестно, то вот админка, которую я здесь так долго мучал:
http://uaclub.org/uahpadmin/update/
Можна даже покляцать, там все равно БД пока что левая))




© OSzone.net 2001-2012