Forum Webscript.Ru
Программирование => PHP => Тема начата: dope от 24 Февраля 2003, 22:47:02
-
shto ja delaju ne tak?
danyje v baze takije:
$templates.directions - "/1/2/3/4/5/6/7/"
$registry ja poluchiaju tozhe - "/3/5/32/43/"
$registry = explode ("/", $row_track["templates"]);
$size = sizeof($registry);
for ($i=1; $i<$size;$i++)
{
$result = mysql_query("SELECT * FROM $templates, $orders WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
$templates.directions LIKE \'%/$registry[$i]/%\'
ORDER BY date DESC");
}
mysql_count_rows($result) vsio vremia pokazyvajet 0, shto nado popravit?
spasibo
-
а то будет, если вместо:
$result = mysql_query("SELECT * FROM $templates, $orders WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
$templates.directions LIKE \'%$registry[$i]%\'
ORDER BY date DESC");
поставить
$result = mysql_query("SELECT * FROM $templates, $orders WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
$templates.directions LIKE \'%$registry[$i]%\'
ORDER BY date DESC") or die(mysql_error());
??
-
or die(mysql_error());
nichevo ne pokazyvajet, vsio, vychodit, shto vsio delajet normalno, no jesli ja zdelaju tak:
$size = (sizeof($registry)-2);
for ($i=1; $i<$size;$i++)
{
togda pokazyvajet te zapisi, kotoryje mne nuzhny, no jesli iz $registry prichodit tol\'ko odna zapis ($registry = "/3/")
togda opiat\' nichevo ne pokazyvajet ;(
-
jeshshio odna detal, pochemu ja delal sizeof($registry) - 2 - eto potomu, shto explode delaet na 2 zapisi bolshe, chem nado
-
а на две записи больше он делает потому что, у тебя строка из базы начинается с / и по нему же ты и разбиваешь... сначала удали начальный и конечный слэш, substr(..) например
-
no jesli iz $registry prichodit tol\'ko odna zapis ($registry = "/3/")
Естественно, не показывает -
3-2=1;
1<1=false
Надо sizeof(...)-1; Либо <= вместо <
-
substr(..)
da, eto pomoglo v kakom to smysle...
seichas narvalsia na druguju problemu:
$track_n = substr($row_track["templates"], 1, -1);
$registry = explode ("/", $track_n);
for ($i=0;$i {
$result = mysql_query("SELECT * FROM $templates, $orders
WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
$templates.directions LIKE \'%/$registry[$i]/%\'
ORDER BY date DESC") or die(mysql_error());
if (mysql_num_rows($result) > 0)
{
while ($row = mysql_fetch_array($result))
{
...
}}}
eto pokazyvajet vse rezultaty, daze odinakovyje, to jest\' oni povtoriajutsa (potomu shto v $registry i v $result mnogoje sovpadajet), podskazhite kak zdelat, shtoby vydaval tol\'ko unique na primer po id?
ili kak mne eto perepisat\'?
-
а так не получается? SELECT distinct id FROM $templates, $orders WHERE ... а потом по этому id выбираешь все остальное. тогд аполучишь точно уникальные записи...
-
SELECT distinct id FROM $templates, $orders WHERE $
da, eto tak, no smysl v tom, shto eto vsio ciklom vyvoditsa, i esli na primer u menia tak:
$templates.directions - "/1/2/3/4/5/6/7/"
$registry ja poluchiaju tozhe - "/1/2/3/4/5/6/7/"
togda ja poluchiu 7 odinakovych zapisej ->
for
{
vybiraem $result
print $result;
}
a esli ja delaju tak:
for
{
vybiraem $result
}
print $result;
togda vydaet posledniuju zapis, esli ona sovpala...
i golova moja durnaja ne mozhet poniat, kak iz etogo vyputatsa...
-
a mozhno li s eval() shtoto zdelat\'?
jesli na primer ja sdelaju tak:
for ($i=0;$i{
$str = "$templates.directions LIKE \'%/$registry[$i]/%\' OR";
eval ("\\$str = \\"$str\\";");
}
$result = mysql_query("SELECT * FROM $templates, $orders
WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
$str
ORDER BY date DESC") or die(mysql_error());
...
tolko ne znaju kak vydelit\' poslednij element masiva, shtoby
vykinut\' poslednij OR iz mysql_query
-
Что-то я не понимаю хитросплетений твоих алгоритмов...
Все просто, а ты усложняешь...
Генерим из "/1/2/3/4/5/6/" SQL-запрос:
$registry=explode(\'/\',$row_track["templates"]);
$str=\'\';
foreach($registry as $value)
if ($value!=\'\') $str.=" $templates.directions LIKE \'%/$value/%\' OR";
$str=substr($str,0,-3);
$res=mysql_qeury("SELECT * FROM $templates, $orders
WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
$str
ORDER BY date DESC") or die(mysql_error());
-
nu vot, shto dve golovy, eto ne odna ;)
spasibo! ;)
-
Пожалуйста (можешь за меня проголосовать ;) )
И что, работает?
-
vecherom proveriu, seichias ne mogu, no vygliadit, shto dolzhno rabotat\' ;)
-
Кстати,
1) Если у тебя в среди чисел может встречаться ноль, тогда $value!= замени на $value!==
2) Использовать foreach с проверкой все-таки хуже, чем просто цикл от 1 до sizeof(...)-1 (кстати, для справки, цикл просто до sizeof(...) выполняется, когда тебе нужно пройти ВЕСЬ массив. Я тебе это уже указывал, но ты посчитал лучше резать строку)
-
nulei netu
когда тебе нужно пройти ВЕСЬ массив
vot eto interesno, ja etovo ne znal ;) mne zhe i nado bylo idti do tex por, poka netu sovpadenija, jesli jest -> print i dalshe takzhe...
Я тебе это уже указывал
vidno ne ponial ;) a to kak zasel na etom, tak uzhe vtoroj den\' prohodit bez dela..
-
И что, работает?
rabotajet ;)
tol\'ko odno zamechanije:
$str nado vziat\' v skobki, a to bez skobok tol\'ko v pervij raz vsio nachinaetsia ot:
WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
...
a potom vybiraet tol\'ko po $str ;)
res=mysql_query("SELECT * FROM $templates, $orders
WHERE $orders.latest > \'$dead\' AND
$orders.pref_reg = $templates.id AND
($str)
ORDER BY date DESC") or die(mysql_error());
thanx ;)