Две проблемы с кодом

1. Мага (25.03.2012 / 10:53)
Первая: почему следующий код не удаляет строки
<? 
if(isset($_GET['delfriend']) and !empty($_GET['id'])){ 
$id=$_GET['id']; 
$dquery=mysqli_query($sql, "SELECT * FROM `friends` WHERE `id` = '".$id."'"); 
$res=mysqli_fetch_array($dquery); 
echo $res[1].''.$res[2]; 
$query=mysqli_query($sql, "DELETE FROM `friends` WHERE `login` = '".$log."' AND `user` = '".$res[1]."';");
$query=mysqli_query($sql, "DELETE FROM `friends` WHERE `user` = '".$log."' AND `login` = '".$res[1]."';");
} 
?>
и вторая: есть таблица friends, есть поля id, login (подавший заявку на дружбу), user (подтверждающий дружбу) и st (статус заявки, если "1" - значит заявка подтверждена), есть файл со списком юзеров онлайн, где "юзер|||posix-время". Код ниже вроде как должен выводить только друзей онлайн, но что-то он не работает
<?
$of=array_reverse(file(ROOT.'data/online.dat'));
$total=count($of);
for ($i = 0; $i < $total; $i++){
$data=explode("<||>",$of[$i]);
$friquery=mysqli_query($sql, "SELECT `user` FROM `friends` WHERE `login` = '".$log."' AND `st`='1' ORDER by `id` DESC");
$fr=mysqli_fetch_array($friquery);
echo $fr[0];
if($data[0]==$fr[2]){
if(file_exists(ROOT.'data/users/'.$data[0].'.dat')){
$uf=file_get_contents(ROOT.'data/users/'.$data[0].'.dat');
$uinfo=explode("[:]",$uf);
$av=$data[0].'.jpg';

if(file_exists("../albums/av/$av")){
$preav="../albums/pre/$av";
$ava="../albums/av/$av";}else{$ava='../Nophoto.jpg';
$preav=$ava;}

if(($uinfo[3]!='') and ($uinfo[4]!='')){
$nick=$uinfo[3].' '.$uinfo[4];}else{$nick=$uinfo[0];}}else{$nick=$data[0];}
echo '<li><a href="'.ROOT.'pages/anketa.php?us='.$data[0].'"><img src='.$preav.'></a></li>';
}}

?>


2. Александр (25.03.2012 / 11:16)
а у тебя что поля в таблице friends называются 1 и 2? Ты делаешь выборку полей $res[1] и $res[2]

Добавлено через 02:37 сек.
это раз. Вовторых ты сам себе создаешь дыру не фильтруя $_GET['id']

Добавлено через 05:57 сек.
пардон. Не заметил что ты используешь fetch_array. Просто никогда им не пользуюсь

3. Мага (25.03.2012 / 12:20)
Спасибо за совет по безопасности) забыл об этом. Проблема не решена.

4. Андрюха (25.03.2012 / 12:53)
_fetch_array возвращает ассоциативный массив,где название столбца - это ключ массива. Тебе нужно юзать $res['name'] и тп. Или юзай _fetch_row

5. Мага (25.03.2012 / 12:55)
fetch_assoc ведь возвращает ассоциативный, нет? При fetch_row выдает точно то же самое.

6. Андрюха (25.03.2012 / 16:22)
fetch_assoc почти тоже самое,что fetch_array. По крайней мере оба возвращают ассоциативный массив

7. ramzes (25.03.2012 / 18:55)
Wapruks (25 Марта 2012 / 16:22)
fetch_assoc почти тоже самое,что fetch_array. По крайней мере оба возвращают ассоциативный массив
отличие в том что fetch_array возвращает и ассоциативный массив и нумерованый

8. Мага (25.03.2012 / 20:31)
А по существу? Очень нужна помощь

9. Александр (25.03.2012 / 21:06)
может ошибка в том, что возвращаемый массив начинается с нулевого ключа? Может тебе нужно не первый ключ, а нулевой?

10. Мага (25.03.2012 / 21:54)
в посте ошибка, сам код уже исправил, поставил нулевой ключ - все то же

11. ramzes (25.03.2012 / 22:03)
WolfEYE (25 Марта 2012 / 20:31)
А по существу? Очень нужна помощь
а по существу, начни с echo mysql_error(); хотя бы

12. Мага (25.03.2012 / 22:16)
Пробовал, ничего не выдает. Если выполнить sql-запрос из кода выше в phpMyAdmin, выводит нужные результаты.

13. ramzes (25.03.2012 / 22:24)
если ни чего не выдает, значит запрос выполнен без ошибок.
смотри в своем коде косяки значит. в частности. неверные переменные

14. Мага (25.03.2012 / 23:27)
В этом -то и дело, что не вижу, поэтому и прошу помощи.

15. Мага (25.03.2012 / 23:50)
Со вторым кодом разобрался, правильный вариант
<?
$of=array_reverse(file(ROOT.'data/online.dat'));
$total=count($of);
$friquery=mysqli_query($sql, "SELECT `user` FROM `friends` WHERE `login` = '".$log."' AND `st`='1' ORDER by `id` DESC");
while($fri=mysqli_fetch_array($friquery)){
echo mysqli_error($sql);
for ($i = 0; $i < $total; $i++){
$data=explode("<||>",$of[$i]);
if($fri['user']==$data[0]){
if(file_exists(ROOT.'data/users/'.$fri['user'].'.dat')){
$uf=file_get_contents(ROOT.'data/users/'.$fri['user'].'.dat');
$uinfo=explode("[:]",$uf);
$av=$data[0].'.jpg';

if(file_exists(ROOT."albums/av/$av")){
$preav=ROOT."albums/pre/$av";
$ava=ROOT."albums/av/$av";}else{$ava=ROOT.'Nophoto.jpg';
$preav=$ava;}

if(($uinfo[3]!='') and ($uinfo[4]!='')){
$nick=$uinfo[3].' '.$uinfo[4];}else{$nick=$uinfo[0];}}else{$nick=$data[0];}
echo '<li><a href="'.ROOT.'pages/anketa?us='.$fri['user'].'"><img src='.$preav.'></a></li>';
}}}

?>


16. Мага (04.04.2012 / 22:20)
Почему переменная $posts в коде ниже выдает '1', хотя записей в базе три?
<?
$pos=mysqli_query($sql, "SELECT * FROM `wall` WHERE `wall` = '".$us."'");
$post=mysqli_fetch_array($pos);
$posts=count($post['id']);
?>


17. Павел (04.04.2012 / 22:21)
mysql_num_rows хотя бы

18. ramzes (04.04.2012 / 22:33)
WolfEYE (4 Апреля 2012 / 22:20)
Почему переменная $posts в коде ниже выдает '1', хотя записей в базе три?
<?
$pos=mysqli_query($sql, "SELECT * FROM `wall` WHERE `wall` = '".$us."'");
$post=mysqli_fetch_array($pos);
$posts=count($post['id']);
?>
потому что в $post['id'] всего один элемент, собственно сам $post['id']

19. Вячеслав (04.04.2012 / 22:39)
$posts=count($post);
как то так
- - -
и вправду.. почему не работает первый код D

20. ramzes (04.04.2012 / 22:53)
<?
if(isset($_GET['delfriend']) and !empty($_GET['id'])){  // эти переменные передаются?
// откуда берется переменная $log  и не пуста ли она?
$id = (int)$_GET['id'];  // тут не было фильтра
$dquery=mysqli_query($sql, "SELECT * FROM `friends` WHERE `id` = '".$id."'");  
$res=mysqli_fetch_array($dquery);  
echo $res[1].''.$res[2];  
$query=mysqli_query($sql, "DELETE FROM `friends` WHERE (login = '".$log."' AND user = '".$res[1]."') OR (user = '".$log."' AND login = '".$res[1]."');"); // тут достаточно одного запроса
echo mysql_errno($sql,) . ' :    ' . mysql_error($sql,); // смотрим репорт об ошибках


21. Вячеслав (04.04.2012 / 22:54)
WolfEYE, насчет траблы в первом коде. ячейка id имеет уникальное значение? накшталт auto_increment?
- - -
вообще что получается: у тебя есть специальный идентификатор "id", по нему ищешь логин и юзер, а потом еще удаляешь эту запись по логину и юзеру. не факт что ты их местами не перепутал и пытаешься удалить несуществующие запись. удаляй по "id"

22. ramzes (04.04.2012 / 22:55)
Trionix (4 Апреля 2012 / 22:39)
и вправду.. почему не работает первый код D
по многим причинам может не работать, начиная от элементарного отсутствия коннекта и заканчивая отсутствием значений в одной из переменных

23. Мага (04.04.2012 / 23:00)
GingerBread (4 Апреля 2012 / 22:21)
mysql_num_rows хотя бы
спасибо, заработало.

Добавлено через 03:23 сек.
20. ramzes, $log объявляется еще в ядре, это твой логин, $_GET['delfriend'] и $_GET['id'] передаются. Сейчас попробую твой код.

Добавлено через 04:50 сек.
Trionix (4 Апреля 2012 / 22:54)
WolfEYE, насчет траблы в первом коде. ячейка id имеет уникальное значение? накшталт auto_increment?
- - -
вообще что получается: у тебя есть специальный идентификатор "id", по нему ищешь логин и юзер, а потом еще удаляешь эту запись по логину и юзеру. не факт что ты их местами не перепутал и пытаешься удалить несуществующие запись. удаляй по "id"
да, она уникальна, но дело в том, что удалить нужно две записи, id одной известен, но id второй, где поля login и user поменялись местами - нет.

Добавлено через 09:58 сек.
ramzes (4 Апреля 2012 / 22:53)
<?
if(isset($_GET['delfriend']) and !empty($_GET['id'])){  // эти переменные передаются?
// откуда берется переменная $log  и не пуста ли она?
$id = (int)$_GET['id'];  // тут не было фильтра
$dquery=mysqli_query($sql, "SELECT * FROM `friends` WHERE `id` = '".$id."'");  
$res=mysqli_fetch_array($dquery);  
echo $res[1].''.$res[2];  
$query=mysqli_query($sql, "DELETE FROM `friends` WHERE (login = '".$log."' AND user = '".$res[1]."') OR (user = '".$log."' AND login = '".$res[1]."');"); // тут достаточно одного запроса
echo mysql_errno($sql,) . ' :    ' . mysql_error($sql,); // смотрим репорт об ошибках

Parse error: syntax error, unexpected ')' in Z:\home\test1.ru\subdomain\pages\friendlist.php on line 79

жалуется на закрытую скобку тут
<?
echo mysql_errno($sql,) . ' :    ' . mysql_error($sql,); // смотрим репорт об ошибках
?>


24. Вячеслав (04.04.2012 / 23:21)
WolfEYE, $res[2] примени D
если структура такая:
id login user st

25. ramzes (04.04.2012 / 23:24)
echo mysql_errno($sql) . ' : ' . mysql_error($sql);
запятые не нужны просто

26. Мага (04.04.2012 / 23:36)
Warning: mysql_errno() expects parameter 1 to be resource, object given in Z:\home\test1.ru\subdomain\pages\friendlist.php on line 79

Warning: mysql_error() expects parameter 1 to be resource, object given in Z:\home\test1.ru\subdomain\pages\friendlist.php on line 79

27. Александр (04.04.2012 / 23:51)
у тебя mysqli. Почему ты ошибку через mysql_ проверяешь?

Добавлено через 02:29 сек.
да и думаю обращаться нужно mysqli_errno($query)

28. Мага (04.04.2012 / 23:59)
вот я олень невнимательный

29. Александр (05.04.2012 / 00:13)
WolfEYE (4 Апреля 2012 / 23:20)
Почему переменная $posts в коде ниже выдает '1', хотя записей в базе три?
<?
$pos=mysqli_query($sql, "SELECT * FROM `wall` WHERE `wall` = '".$us."'");
$post=mysqli_fetch_array($pos);

?>
ты походу сам в коде запутался ))
$post=mysqli_fetch_array($pos); запрашиваешь числовой массив
$posts=count($post['id']); проверяешь асоциативный

30. ramzes (05.04.2012 / 00:16)
rastoman (5 Апреля 2012 / 00:13)
ты походу сам в коде запутался ))
$post=mysqli_fetch_array($pos); запрашиваешь числовой массив
$posts=count($post['id']); проверяешь асоциативный
вообще то не числовой, а смешанный
цифровой получают через fetch_row

31. Мага (05.04.2012 / 03:03)
Проблема была в переменных. $log и $res[1] имеют одно значение, т.е. запрос WHERE login = $log AND user = '".$res[1]."' неправильный. Проблема решена, всем спасибо)

32. Вячеслав (05.04.2012 / 11:32)
5 часов до того как прочитаешь и дойдет тоже не плохо, хотя могло быть и лучше smile

33. Мага (05.04.2012 / 16:54)
32. Trionix, извини, твой пост не заметил)) я же говорю - невнимательный я)))

URL: https://visavi.net/topics/30793