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 :: Версия для печати :: Проблемы с регистрацией вылетает ошибка mysql_result
Форумы портала PHP.SU » PHP » Программирование на PHP » Проблемы с регистрацией вылетает ошибка mysql_result

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

1. Antosha - 09 Января, 2010 - 20:46:08 - перейти к сообщению
Помогите пожалуйста... Закатив глазки
Нажимаю регистрация вот такая ошибка появляеться:
Внизу есть сам скрипт регистрации кто может и знает помогите переделать подскажите)
Заранне спасибо )
CODE (text):
скопировать код в буфер обмена
  1. Warning: mysql_result() expects parameter 1 to be resource, boolean given in C:\Program Files\xampplite\htdocs\www\reg\registranion_controller.php on line 30




Вот как выглядет registranion_controller.php

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Подключаем конфигурационный файл
  3.     include '/reg/config.php';
  4. // Подключаем файл коннекта
  5.     include '/reg/mysql_connect.php';
  6. // Подключаем файл с функциями
  7.     include '/reg/default.php';    
  8.    
  9. // Инициализация переменных
  10. $user_login = !empty($_POST['user_login'])?$_POST['user_login']:NULL;
  11. $user_password = !empty($_POST['user_password'])?$_POST['user_password']:NULL;
  12. $ok = isset($_POST['ok'])?true:false;
  13.  
  14. define('SALT','YRSXDIVLITGG7');
  15.  
  16. if($ok)
  17. {    
  18.  
  19.     if(mb_strlen($user_password) < 8)
  20.     {
  21.     echo 'Пароль не надежен, меньше 8-ми символов.';
  22.     }
  23.     else
  24.     {
  25.     $res = mysql_query("SELECT COUNT(*) AS `cnt`
  26.                        FROM `". DB_PREFIX ."user`
  27.                        WHERE `login` = '". mysql_real_escape_string($user_login) ."'
  28.                        ");
  29.                    
  30.         if(mysql_result($res,0) > 0)
  31.         {
  32.             echo 'Есть у нас уже один '. htmlspecialchars($user_login) .'. Попробуйте выбрать другой логин.';
  33.         }
  34.         else
  35.         {        
  36. // Создаем учетную запись    
  37.         mysql_query("INSERT INTO `". DB_PREFIX ."user`
  38.                    SET `login` = '". mysql_real_escape_string($user_login) ."',
  39.                    `password` = '". md5($user_password . SALT) ."'
  40.                    ");
  41.     // Если установлена галочка автологина                
  42.             if(isset($_POST['autologin']))
  43.             set_autologin(mysql_insert_id());
  44.                            
  45.         echo 'Все в порядке';
  46.        
  47.         }
  48.     }
  49. }
  50. ?>
  51. <form action="" method="post">
  52. Логин <input name="user_login" type="text"><br>
  53. Пароль <input name="user_password" type="password"><br>
  54. <input name="autologin" type="checkbox" value=""> Запомнить Вас?<br>
  55. <input name="ok" type="submit" value="Зарегистрироваться">
  56. </form>



Вот как выглядет autorize_controller.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. // Подключаем конфигурационный файл
  4.     include '../reg/config.php';
  5. // Подключаем файл коннекта
  6.     include '../reg/mysql_connect.php';
  7. // Подключаем файл с функциями
  8.    
  9.  
  10. $user_login = !empty($_POST['user_login'])?$_POST['user_login']:NULL;
  11. $user_password = !empty($_POST['user_password'])?$_POST['user_password']:NULL;
  12. $ok = isset($_POST['ok'])?true:false;
  13. define('SALT','YRSXDIVLITGG7');
  14.  
  15. // Проверяем, есть ли сессионная переменная, отвечающая за авторизацию
  16. // Если нет такой, предъявите аусвайс!
  17. if(empty($_SESSION['login']))
  18. {
  19.     if(isset($_COOKIE['hash']))
  20.     {
  21.     $_SESSION['login'] = get_login($_COOKIE['hash']);
  22.     }
  23.     elseif($ok)
  24.     {
  25.  
  26.     $res = mysql_query("SELECT `id`, `login`
  27.                        FROM `". DB_PREFIX ."user`
  28.                        WHERE `login` = '". mysql_real_escape_string($user_login) ."'
  29.                        AND `password` = '". md5($user_password . SALT) ."'
  30.                        ");
  31.                    
  32.         if(mysql_num_rows($res) > 0)
  33.         {
  34.         $row = mysql_fetch_assoc($res);
  35.                 // Если установлена галочка автологина                
  36.                 if(isset($_POST['autologin']))
  37.                 set_autologin($row['id']);
  38.            
  39.         $_SESSION['login'] = $row['login'];            
  40.         }
  41.     }
  42.  
  43.     if(isset($_SESSION['login']))
  44.     echo 'Проходи, '. $_SESSION['login'] .'!';
  45.     else
  46.     echo 'Стой, стрелять буду!';
  47. }
  48. ?>
  49. <form action="" method="post">
  50. Логин <input name="user_login" type="text"><br>
  51. Пароль <input name="user_password" type="password"><br>
  52. <input name="autologin" type="checkbox" value=""> Запомнить Вас?<br>
  53. <input name="ok" type="submit" value="Тук-тук">
  54. </form>


Вот как выглядет default.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function rand_str($num = 10)
  4. {
  5. $arr_num = range("0","9");  
  6. $arr_let = range("a","z");  
  7.  
  8. $arr = array_merge($arr_num,$arr_let);  
  9. $arr = array_merge($arr,$arr);  
  10. $arr = array_merge($arr,$arr_let);  
  11. $arr[] = "a";  
  12.  
  13. $rand = microtime(true);  
  14.     for($i = 0; $i < $num; $i++)  
  15.     {
  16.     shuffle($arr);  
  17.     $key .= $arr[(round(($rand * 1000 - floor($rand * 1000)),2) * 100 )];  
  18.     $rand = microtime(true);  
  19.     }
  20. return $key;
  21. }
  22.  


Файлы
2. JustUserR - 10 Января, 2010 - 01:02:23 - перейти к сообщению
Antosha Функция mysql_result принимает при аргумента - ресурс ответа mysql а также строку и столбец из этого ответа Если вы вызываете данную функцию с двумя аргументами то она вернет хеш (Ассоциативный массив) из элементов данной стоки Если же вам надо проверить ответа на пустоту то используйте сравнение с mysql_num_rows к примеру
3. Nestor - 10 Января, 2010 - 01:08:39 - перейти к сообщению
Цитата:
Warning: mysql_result() expects parameter 1 to be resource, boolean given in C:\Program Files\xampplite\htdocs\www\reg\registranion_controller.php on line 30


Надо передать ресурс, передано булево значение, скорее всего скрипт просто не смог соединиться с базой
4. JustUserR - 10 Января, 2010 - 01:19:05 - перейти к сообщению
Nestor пишет:
Скорее всего скрипт просто не смог соединиться с базой
А может запрос ничего не вернул - вероятно была ошибка в SQL-запросе - ведь в данном случае имеется в виду не ресурс подключения к базе а ресурс ответа от базы (Возвращенный от mysql_result)
5. Nestor - 10 Января, 2010 - 01:23:50 - перейти к сообщению
Тогда надо смотреть на mysql_error().

ИМХО при работе с БД нужно использовать объектно ориентированный подход
6. JustUserR - 10 Января, 2010 - 01:44:24 - перейти к сообщению
Nestor пишет:
Тогда надо смотреть на mysql_error()
Да согласен и вообще при решении любых проблем с отладкой PHP-скриптов желательно приводить debug trace который включает var_dump нужных переменных
Nestor пишет:
ИМХО при работе с БД нужно использовать объектно ориентированный подход
Поинтересуюсь у вас - а это дает какоенибудь преимущество при отладке? Мне кажется что ООП-подход в PHP дает меньшую эффективность - но это ИМХО так как я не проверял это отдельно
7. Nestor - 10 Января, 2010 - 03:21:30 - перейти к сообщению
Да, мой класс для работы с БД при ошибке выводит сообщение, но вся система еще не дописана и пока обхожусь только die (mysql_error ()), в идеале ошибка будет записываться в лог и отправляться на центральный сервер для ее решения.

Мне намного удобнее сделать так
чем так
PHP:
скопировать код в буфер обмена
  1. mysql_query() or die( mysql_errno() . ' - ' . mysql_error() );


Да и вообще мне почему-то очень полюбился ООП.
8. Hunter - 10 Января, 2010 - 07:32:43 - перейти к сообщению
JustUserR
Antosha пишет:
<form action="" method="post">

а проблема не может заключаться в том что обработчик не указан явно? (ток не пинайте, просто я их на всякий случай прописываю даже если скрипт сам себе отсылает данные,..)??
9. Antosha - 10 Января, 2010 - 09:56:02 - перейти к сообщению
Спасибо всем за овтеты только я не понял... (может быть так как изучаю php всего недавно...) Закатив глазки
Будьте добры подскажите готовое решение проблемы)
СпасибА
10. Ammy - 10 Января, 2010 - 10:36:37 - перейти к сообщению
Чем-то напоминает мне код IRBIS Team. Кто зрячий?
http://irbis-team[dot]ru/regist/index.php?a=2

Автору бы надо обратиться за помощью к первоисточнику, ведь там уроки, причём неплохие для начального уровня, да и к тому же код ихний из примеров.
11. Antosha - 10 Января, 2010 - 10:51:09 - перейти к сообщению
Ammy пишет:
Чем-то напоминает мне код IRBIS Team. Кто зрячий?
http://irbis-team[dot]ru/regist/index.php?a=2

Автору бы надо обратиться за помощью к первоисточнику, ведь там уроки, причём неплохие для начального уровня, да и к тому же код ихний из примеров.


Ты прав) Но там все молчат...
..плюс нигде не нашёл подобных статей по подробному написанию скрипта регистрации)
(Добавление)
Впринципе не мешало бы и тут создать такую темку=)
Ну всысле на примерах же легче учиться)
Улыбка
12. alpha_beta - 10 Января, 2010 - 11:03:38 - перейти к сообщению
Nestor,
Цитата:
Мне намного удобнее сделать так

Никто не мешает завернуть sql-функции в набор процедур, тем более что их надо то 4 штуки. А в них и логирование и die можно вписать. Плюсом будет то, что код станет независим от БД (если все правильно реализовать), но это маленький плюс если честно Улыбка
13. JustUserR - 10 Января, 2010 - 12:37:40 - перейти к сообщению
Hunter пишет:
А проблема не может заключаться в том что обработчик не указан явно? (ток не пинайте, просто я их на всякий случай прописываю даже если скрипт сам себе отсылает данные,..)??
Да очень хорошо что вы это заметили - действительно так никогда делать нельзя - надо использовать $_SERVER['PHP_SELF']
14. Ammy - 10 Января, 2010 - 13:28:07 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $res = mysql_query("SELECT * FROM `". DB_PREFIX ."user`
  2.            WHERE `login` = '". mysql_real_escape_string($user_login) ."'") or die(mysql_error());
  3.  
  4. if (mysql_num_rows($res) > 0) {
  5.  
  6.     echo 'Есть у нас уже один '. htmlspecialchars($user_login) .'. Попробуйте выбрать другой логин.';
  7.  
  8. }


Или сразу же вставлять данные в базу, а за результатом того, как прошёл запрос, проследить следующим образом:

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. if (!$res && mysql_errno() == 1062)) die("Данный логин уже зарегистрирован!");
  4.  
  5.  


Так как ошибка 1062 сообщает нам о 'Duplicate entry'.
15. JustUserR - 10 Января, 2010 - 13:34:38 - перейти к сообщению
Antosha И уж тогда вдобавок
CODE (HTML):
скопировать код в буфер обмена
  1. <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
  2. Логин <input name="user_login" type="text"><br>
  3. Пароль <input name="user_password" type="password"><br>
  4. <input name="autologin" type="checkbox"> Запомнить Вас?<br>
  5. <input name="ok" type="submit" value="Тук-тук">
  6. </form>

 

Powered by ExBB FM 1.0 RC1