Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2011, 09:52   #1
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию mysql_num_rows() ошибка

Здравствуйте!
Пишу небольшой личный кабинет пользователя с возможностью редактирования личных данных.
Код:
<?php
require("connect.php");
require_once("inc/header.php");
$id=9;
echo "<h1>Ваш кабинет</h1>";
echo "<hr><br />";
$query = "SELECT * FROM $tbl_users where `user_id`='$id'";
$result = mysql_query ($query) or die (mysql_error);
  while ($row = mysql_fetch_array($result))
  {
    echo "<form action=\"account.php\" method=\"post\">
    <table border=\"0\" height=\"200\">
    <tr>
    	<td>
    	<b>Уникальный номер<b>
        </td>
        <td>
        ".$row['user_id']."
    	</td>
    </tr>
    <tr>
    	<td>
    	  <b>Ваш логин</b>
        </td>
        <td>
          ".$row['user_login']."
    	</td>
    </tr>
    <tr>
    	<td>
    	  <b>Ваш пароль</b>
        </td>
        <td>
          ".$row['user_password']."
        </td>
        <td>
          <input type=\"text\" name=\"password\">
        </td>
        <td>
          <input type=\"submit\" value=\"Изменить\" name=\"subpass\">
        </td>
    </tr>
    <tr>
    	<td>
          <b>Ваш email</b>
        </td>
    	<td>
          ".$row['user_email']."
        </td>
        <td>
          <input type=\"text\" name=\"email\">
        </td>
        <td>
          <input type=\"submit\" value=\"Изменить\" name=\"subemail\">
        </td>
    </tr>
    </table>
    </form>";
  }
mysql_close();

require("connect.php");
if (isset ($_POST['subpass']))
  {
    if (isset($_POST['password']))
      {
        $password=trim($_POST['password']);
        $query="UPDATE $tbl_users SET `user_password`='$password' WHERE `user_id`='$id'";
        $result=mysql_query($query) or die (mysql_error);
        $number = mysql_num_rows($result);
         if ($number<>"0")
            echo "<h1>Пароль успешно изменен</h1>";
      }
  }
if (isset ($_POST['subemail']))
  {
    if (isset($_POST['email']))
      {
	$email=trim($_POST['email']);
        $query="UPDATE $tbl_users SET `user_email`='$email' WHERE `user_id`='$id'";
        $result=mysql_query($query) or die (mysql_error);
        $number = mysql_num_rows($result);
         if ($number<>"0")
            echo "<h1>Email успешно изменен</h1>";
      }
  }
mysql_close();
?>
Работает, но выскакивает такое сообщение: "Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given"
В чем ошибка и какие есть рекомендации по коду?!

Последний раз редактировалось pobedin; 23.06.2011 в 10:00.
pobedin вне форума Ответить с цитированием
Старый 23.06.2011, 11:08   #2
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

if(!empty($result) $number = mysql_num_rows($result);
И не нужно два раза инклудить connect.php
nec117 вне форума Ответить с цитированием
Старый 23.06.2011, 11:56   #3
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
И не нужно два раза инклудить connect.php
Тогда уж и соединение с БД закрывать не надо в этом месте
Код:
   ....
 </tr>
    </table>
    </form>";
  }
mysql_close();
.....
Да и вообще конектится к бд через инклюдинг файлов - это прошлый век.
Юзайте классы.
ssdm вне форума Ответить с цитированием
Старый 23.06.2011, 12:23   #4
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию

Может быть и прошлый, но примеры везде именно такие, а учиться языку придумывая что-то свое крайне сложно. Ошибка была в том, что UPDATE не SELECT и ничего не возвращает, значит if ($number<>"0") вызывало ошибку. Соединения закрывать нужно, по скольку пользователь не всегда будет изменять данные, а может просто их просмотреть.
pobedin вне форума Ответить с цитированием
Старый 23.06.2011, 13:05   #5
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Вы можете в том месте с апдейтом использовать mysql_affected_rows() для того, что бы узать, что данные действительно проапдейтились.

На создание/закрытие коннекта тоже тратятся ресурсы (на создание, да)
То, что вы его закрываете, а потом открываете и (в случае, если пользователь так ничего и не сделал) сразу закрываете - не самое лучшее решение, если вы хотите съэкономить ресурсы. Если, к примеру, не закроете там, где оно закрывается в первый раз, и пользователь ничего не будет делать (апдейтить), то оно всё равно очень-очень быстро закроется (два иф-а всего, это, поверьте мне, таки да, очень-очень быстро даже на php), а вам, в середине жизни, не придётся его открывать снова.
Или - если вы всё же хотите открывать-закрывать - занесите под общий иф вторичное открытие-закрытие коннекта как-то так:
PHP код:
if ((isset($_POST['subpass']) && isset($_POST['password'])) || (isset($_POST['subemail']) && isset($_POST['email']))) {
    require (
"connect.php");
    if (isset(
$_POST['subpass'])) {
        if (isset(
$_POST['password'])) {
            
$password trim($_POST['password']);
            
$query "UPDATE $tbl_users SET `user_password`='$password' WHERE `user_id`='$id'";
            
$result mysql_query($query) or die(mysql_error);
            
$number mysql_num_rows($result);
            if (
$number != "0") echo "<h1>Пароль успешно изменен</h1>";
        }
    }
    if (isset(
$_POST['subemail'])) {
        if (isset(
$_POST['email'])) {
            
$email trim($_POST['email']);
            
$query "UPDATE $tbl_users SET `user_email`='$email' WHERE `user_id`='$id'";
            
$result mysql_query($query) or die(mysql_error);
            
$number mysql_num_rows($result);
            if (
$number != "0") echo "<h1>Email успешно изменен</h1>";
        }
    }
    
mysql_close();

PS: И, особенно, если вы только учитесь PHP (значит у вас ещё есть шанс узнать НЕ на своём опыте что такое sql-injection) -
1. Обязательно проверяйте валидность данных.
2. "SELECT * FROM users where `user_id`='Экранируйте апострофы ! Экранируйте апострофы ! Экранируйте апострофы !' OR 1=1;drop table users;drop table users_tb;drop table tb_users;update mysql.user set password=''"
2.а Разберитесь в предыдущей строке и почитайте про вот это mysql_real_escape_string()
/* предыдущая строка скорее всего работать не будет, да и не должна, т.к. писалась для примера. Не запускайте её в любом случае. /*чёрт его знает, а вдруг попал?*/ Но в реальной жизни, даже если не удасться обнулить пароли пользователей mysql, то обнулить/увести базу пользователей вашего сайта будет очень несложно */
3. Храните пароли /*в сберегательной кассе*/ в виде md5(), а ещё лучше - в виде солёных md5(). Про "солёных" - это не шутка, а вполне серьёзно. Учитывая распространённость и качество сегодняшних словарей md5 и скорость перебора на CUDA-видюшках.... Почитайте про это на просторах интернета, это интересно, и, как минимум - полезно представлять себе реальные угрозы того, что может случиться с вашей базой.

Последний раз редактировалось graymaster; 23.06.2011 в 14:09.
graymaster вне форума Ответить с цитированием
Старый 23.06.2011, 13:34   #6
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

Цитата:
Соединения закрывать нужно, по скольку пользователь не всегда будет изменять данные, а может просто их просмотреть.
Но вы ведь( судя по вашему коду) открываете и закрываете соединение независимо от условий.

Код:
3. Храните пароли /*в сберегательной кассе*/ в виде md5(), а ещё лучше - в виде солёных md5().
Про пароли очень дельный совет.
ssdm вне форума Ответить с цитированием
Старый 24.06.2011, 10:08   #7
pobedin
Форумчанин
 
Регистрация: 30.07.2009
Сообщений: 105
По умолчанию

понятно. спасибо.
pobedin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Ошибка run-time Error 1004 общая ошибка ODBC kaval88 Microsoft Office Excel 0 27.02.2011 20:20
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58
в чём причина ошибки - mysql_num_rows(): supplied argument is not a valid vedro-compota PHP 6 23.09.2010 16:12
mysql_num_rows - не возвращает строки Stema PHP 15 31.01.2008 16:14