[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: I vs OOP Часть #2
m4a1fox
Всем доброго дня! Собственно часть номер 2 моего боя с OOP! Ну так ладно, это понятно из названия. Собственно сам вопрос. Насколько понимаю на OOP можно сделать соединение с БД. Собственно, может подскажите с чего начать, а то я так понимаю, если самому лезть в такие дебри, то потом много ненужных вопросов будут появляться. Я, собственно интересуюсь, статьями, советами, и не прошу писать скрипт за меня... Спасибо!



Спустя 13 минут, 3 секунды (3.07.2011 - 14:22) m4a1fox написал(а):
О! bulgakov. Подсоби а?

Спустя 1 минута, 28 секунд (3.07.2011 - 14:23) bulgakov написал(а):


$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
$mysqli->query(SOME MYSQL QUERY);
$mysqli->close();


Например как-то так.

Спустя 1 минута, 34 секунды (3.07.2011 - 14:25) bulgakov написал(а):
Вообщем смотри описание модуля mysqli на php.net

Спустя 37 секунд (3.07.2011 - 14:26) bulgakov написал(а):
Там все тоже самое что ты делаеш в процедурном подходе с mysql модулем только в объектно-ориентированном стиле ну плюс некоторые различия но это все описано.

Спустя 3 минуты, 6 секунд (3.07.2011 - 14:29) tatti написал(а):

Спустя 26 секунд (3.07.2011 - 14:29) m4a1fox написал(а):
bulgakov
Ок! Спасибо! Буду смотреть?!

Спустя 42 секунды (3.07.2011 - 14:30) m4a1fox написал(а):
tatti
Прикольная АВА smile.gif

Спустя 35 секунд (3.07.2011 - 14:30) alex12060 написал(а):
m4a1fox

Для начала пойми, что такое ООП.
Почитай про 3 замечательных свойства ООП в пыхе.
Испробуй сааамые базовые примеры, разберись в них и тогда, стартуй.

Спустя 4 минуты, 23 секунды (3.07.2011 - 14:35) m4a1fox написал(а):
alex12060
Цитата
Почитай про 3 замечательных свойства ООП в пыхе.

Это какие? Может я уже читал?

Спустя 5 минут, 7 секунд (3.07.2011 - 14:40) alex12060 написал(а):
  • Полиморфизм
  • Инкапсуляция
  • Наследование

Спустя 1 минута, 21 секунда (3.07.2011 - 14:41) m4a1fox написал(а):
alex12060
А! Теперь понятно! Вот верите, читаю уже довольно долго, но как-то без пинка не получается... sad.gif

Спустя 3 минуты, 44 секунды (3.07.2011 - 14:45) bulgakov написал(а):
Свернутый текст
user posted image Куда пнуть?)

Спустя 5 минут, 46 секунд (3.07.2011 - 14:51) m4a1fox написал(а):
bulgakov
Я не сомневался.... думаю в голову нормально будет! :D
Ладно... Как говорят французы...ближе к телу товарищи. Собственно вопрос следующего плана, Допустим класс, кот я с помощью bulgakov'a смог преодолеть... в моей саге <<<I vs OOP>>> часть #1, кот, проверяет пользователя на ввод информации... Так вот, Я его выношу в отдельный файл (например class.member.php). Подключаю его на странице, с этим естественно проблем нету, а вот дальше - интересно. Получается что если есть страница html то на странице, где я хочу, что бы класс вывел какую либо информацию, я делаю так

<?php
$member = new Member($name);
echo $member->hello();
?>

Это собственно верно или где?

Спустя 3 минуты, 37 секунд (3.07.2011 - 14:54) bulgakov написал(а):
Гм... я просто не могу понять что вы хотите... в коде вы привели пример создания экземлпяра $member класса Member, и вызвали метод объекта - hello().... и собственно что вы хотите?... Можно как-то яснее и конкретнее поставить вопрос?

Спустя 9 минут, 21 секунда (3.07.2011 - 15:04) m4a1fox написал(а):
bulgakov
Извините, конечно можно! Собственно сам класс

$name = true;
class Member
{
private static $name = 'Max';
private static $pas = '123';

function __construct($name) {
$name = !empty($_POST['log']) ? $_POST['log'] : 'Гость';
$pas = !empty($_POST['pas']) ? $_POST['pas'] : NULL;
$this->name = $name;
$this->pas = $pas;
}

function hello () {
if (isset ($_POST['ok'])){
if ($this->name == self::$name && $this->pas == self::$pas)
return header('Location: second.php');
else {
return '<font color="red">Вы ввели неверное имя или пароль</font>';
}
}

else
{
return NULL;
}
}
}


Конечно храмой, но работает. Как Вы видите вот тут

private static $name = 'Max';
private static $pas = '123';

есть переменные, если в поле ввода формы, поля совпадают, то происходит переход вот тут

return header('Location: second.php');


Вопрос в следующем, получается, что если можно написать скрипт, для проверки введеных данных на непроцедурном подходе, то я хочу понять как написать это же только с использованием OOP. Процес я прекрасно понимаю.
1. Необходим класс для connect'a с БД. (для меня это проблема)
2. Необходимо, что бы класс, который я привел выше, брал данные не из строк, а из БД. (это так же проблема.)
Вот... Если есть идеи, и время, буду благодарен за помощь. Спасибо!

Спустя 8 минут, 55 секунд (3.07.2011 - 15:13) bulgakov написал(а):

$name = true;
class Member
{
private static $name = 'Max';
private static $pas = '123';

function __construct($name) {
$name = !empty($_POST['log']) ? $_POST['log'] : 'Гость';
$pas = !empty($_POST['pas']) ? $_POST['pas'] : NULL;
$this->name = $name; // читайте про доступ к статическим свойствам класса это неправильно
// правильно - self::$name = $name

$this->pas = $pas; // откуда взяться переменной $pas? может вы забыли ее добавить в аргумент конструктора? Опять же
// неправильный доступ к статической переменной

}

function hello () {
if (isset ($_POST['ok'])){
if ($this->name == self::$name && $this->pas == self::$pas) // то ли у вас не хвататет двух публичных свойств класса то ли я не понимаю логику работы скрипта
return header('Location: second.php');
else {
return '<font color="red">Вы ввели неверное имя или пароль</font>';
}
}

else
{
return NULL;
}
}
}


Немного непонятно как может этот класс работать... я там в комментариях написал..

Спустя 9 минут, 49 секунд (3.07.2011 - 15:23) m4a1fox написал(а):
Ага! Ну смотрите. Вот форма

<form action="" method="post">
<table
border="0">
<tr>
<td>

Логин:
</td>
<td>
<input
type="text" name="log"/>
</td>
</tr>
<tr>
<td>

Пароль:
</td>
<td>
<input
type="password" name="pas" />
</td>
</tr>

<tr>
<td>

</td>
<td>
<input
type="submit" name="ok" />
</td>
</tr>
</table>
</form>



При отправке данных вот это

function __construct($name) {
$name = !empty($_POST['log']) ? $_POST['log'] : 'Гость';
$pas = !empty($_POST['pas']) ? $_POST['pas'] : NULL;
$this->name = $name;
$this->pas = $pas;
}

Их принимает, обрабатывает и заносит в $name & $pas
а вот тут

if ($this->name == self::$name && $this->pas == self::$pas)

Я проверяю, если они

$this->name
$this->pas

равны вот этим

private static $name = 'Max';
private static $pas = '123';

Тогда идет переадресация, иначе вывод сообщения об ошибке.
Как-то так. Но оно работает!

Спустя 9 минут, 13 секунд (3.07.2011 - 15:32) Invis1ble написал(а):
m4a1fox
Цитата
return header('Location: second.php');

header() ничего не возвращает, поэтому можно без return

Спустя 1 минута, 36 секунд (3.07.2011 - 15:33) m4a1fox написал(а):
Invis1ble
О! Не знал! Спасибо! Буду в будущем испольлзовать.

Спустя 2 минуты, 56 секунд (3.07.2011 - 15:36) Invis1ble написал(а):
m4a1fox
Основная твоя проблема на данном этапе заключается в том, что тебе не хватает теоритических знаний. начни с основ ООП.

Спустя 2 минуты, 22 секунды (3.07.2011 - 15:39) bulgakov написал(а):
Ну да начать с основ не помешало бы, а если по твоей теме я так понял ты сейчас уперся в работу с базой данных через ооп подход? Ну я тебе уже подсказал что для этого есть класс mysqli читай его описание, но для того что бы понять что к чему все таки нужны основы ооп.

Спустя 3 минуты, 37 секунд (3.07.2011 - 15:42) m4a1fox написал(а):
Вот верите, про основы уже 2 неделю читаю, только читаю и читаю. Я не могу понять главного, даже если есть класс, как с нима работать, именно сам механизм. Хорошо, я понимаю так же что не так просто и реально очень сложно, но вот простой пример. С сайта http://kurepin.ru. Вот его класс

class class_Mysql extends class_Vars
{
var $sql_login="root";
var $sql_passwd="oracle";
var $sql_database="oop";
var $sql_host="127.0.0.8";

var $conn_id;
var $sql_query;
var $sql_err;
var $sql_res;

function sql_connect()
{
$this->conn_id=mysql_connect($this->sql_host,$this->sql_login,$this->sql_passwd);
mysql_select_db($this->sql_database);
}

function sql_execute()
{
$this->sql_res=mysql_query($this->sql_query,$this->conn_id);
$this->sql_err=mysql_error();
}

function sql_close()
{
mysql_close($this->conn_id);
}


Так же прикиним, что я понимаю что здесь происходит, но как с этим в дальнейшем работать, вот в чем главный вопрос. Как например мне выбрать записи из табл. admin? Просто выбрать и вывести в столбик. Ничего грандиозного.

Спустя 3 минуты, 16 секунд (3.07.2011 - 15:46) Invis1ble написал(а):
m4a1fox
в данном примере используется устаревший синтаксис, очевидно, код написан под php4
но это не главное,
главное то, что он наследует родительский класс class_Vars, нужно смотреть код этого класса

Спустя 2 минуты, 10 секунд (3.07.2011 - 15:48) bulgakov написал(а):
А что такого в работе с классом? создаете объект класса, а дальше уже пользуетесь через этот объект свойствам и методами класса, так же если в классе есть статические методы и свойства а так же константы класса тоже к ним можете получить доступ через двойное двоеточие, ну и при создании объекта класса если необходимо передаете в его конструктор нужные параметры, ну это очень кратко, позвольте узнать что вы читаете если до сих пор не понятно как работать с классом? И да var не ставиться перед свойствами класса, ставится public.

Спустя 2 минуты, 19 секунд (3.07.2011 - 15:50) m4a1fox написал(а):
Invis1ble
Не вопрос. Но class.var.php мне кажется большой роли не играет
Собственно вот он сам

<?php

/**
*
@TODO
* @author m4a1fox
*
@copyright 2011 m4a1fox
*/

class class_Vars
{// Пути к папкам.
var $PATH="/home/www.oop.com"; // основной путь к проекту
var $PATH_INC="/home/www.oop.com/inc";
var $PATH_REQ="/home/www.oop.com/req";
var $PATH_DATA="/home/www.oop.com/data";
var $PATH_WWW="/home/www.oop.com/WWW";
var $PATH_WWW_PIC="/home/www.oop.com/WWW/pic";

// Основной URL
var $PATH_HTTP="http://www.oop.com/";

// Полное название и короткое
var $NAME_FULL="Это OOP штука";
var $NAME_SHORT="OOP - Max";

// адрес хозяина страницы
var $EMAIL_ADMIN=array("www.oop.com");

// техническая служба сайта
var $EMAIL_NOC=array("www.oop.com","www.oop.com");

// Время кеширования страниц "Expires" (в секундах)
var $CACHE_TIME=300;

// Максимальный размер подгружаемого в базу текста
var $TEXT_SIZE_MAX= 1048576; // это мегабайт

// Минимальный размер подгружаемого в базу текста

var $TEXT_SIZE_MIN=100; // сто байт

// Формат вывода времени (из SQL-базы)

var $TIME_FORMAT="%H:%i:%S"; // ЧЧ:ММ:СС

// Формат вывода даты (из SQL-базы)

var $DATE_FORMAT="%d.%m.%Y"; // ДД.ММ.ГГГГ
}
?>


Спустя 1 минута, 10 секунд (3.07.2011 - 15:51) Invis1ble написал(а):
Цитата
copyright ©2000-2002 Ruslan Kurepin

по-моему, этим все сказано
забудь про этот сайт и увиденный тобой синтаксис как страшный сон

Спустя 15 секунд (3.07.2011 - 15:51) m4a1fox написал(а):
bulgakov
Просто что бы все понимал. На пример вот так
Цитата
создаете объект класса

Это например так

$connect = new class_Mysql();

Спустя 38 секунд (3.07.2011 - 15:52) m4a1fox написал(а):
Invis1ble
ок! Будем по другому....

Спустя 1 минута, 55 секунд (3.07.2011 - 15:54) m4a1fox написал(а):
Есть варианты для грамотного соединения с БД?

Спустя 1 минута, 27 секунд (3.07.2011 - 15:55) bulgakov написал(а):
Ну зачем ходить по левым сайтом? Вот же все расписано...

Спустя 36 секунд (3.07.2011 - 15:56) bulgakov написал(а):
Цитата
Есть варианты для грамотного соединения с БД?

А то что я написал используя mysqli не грамотно?

Спустя 1 минута, 56 секунд (3.07.2011 - 15:58) bulgakov написал(а):
А вот я думаю неплохая информация по работе с mysqli Я думаю вам этого будет пока достаточно.

Спустя 37 секунд (3.07.2011 - 15:59) m4a1fox написал(а):
bulgakov
Цитата
Ну зачем ходить по левым сайтом? Вот же все расписано...

У меня эти странице распечатаны и переведенны в pdf, читаю их, аки отче наш!

Спустя 2 минуты, 32 секунды (3.07.2011 - 16:01) bulgakov написал(а):
Ну вот плюс почитайте ссылочку по mysqi.

Спустя 1 минута, 10 секунд (3.07.2011 - 16:02) m4a1fox написал(а):
bulgakov
Как-то странно, не находите

<?php

/* Подключение к серверу MySQL */
$mysqli = new mysqli('localhost', 'user', 'password', 'world');

if (mysqli_connect_errno()) {
printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error());
exit;
}

/* Посылаем запрос серверу */
if ($result = $mysqli->query('SELECT Name, Population FROM City ORDER BY
Population DESC LIMIT 5'
)) {

print("Очень крупные города:\n");

/* Выбираем результаты запроса: */
while( $row = $result->fetch_assoc() ){
printf("%s (%s)\n", $row['Name'], $row['Population']);
}

/* Освобождаем память */
$result->close();
}

/* Закрываем соединение */
$mysqli->close();
?>

Эээээ, а где класс?

Спустя 2 минуты, 15 секунд (3.07.2011 - 16:05) bulgakov написал(а):
Ммм я помоему уже несколько раз писал что mysqli это есть встроенный в php класс для работы с базой данных mysql или хотя бы намекал на это в коде...

Спустя 1 минута, 50 секунд (3.07.2011 - 16:06) m4a1fox написал(а):
То есть вот так

load= new mysqli("localhost","username","password","database");

И весь коннект?

Спустя 29 секунд (3.07.2011 - 16:07) Invis1ble написал(а):
Вот более высокая степень абстракции (пример сыроват, значения поменять на свои):

$driver = 'mysql';
$database = 'test';
$host = 'localhost';
$username = 'root';
$passwd = 'root';
$dsn = $driver . ':dbname=' . $database . ';host=' . $host;

try {
$pdo = new PDO($dsn, $username, $passwd);
$q = $pdo->query('select * from `table`');
$data = $q->fetchAll();
var_dump($data);
}
catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

Спустя 2 минуты, 34 секунды (3.07.2011 - 16:09) m4a1fox написал(а):
Цитата
Ммм я помоему уже несколько раз писал что mysqli это есть встроенный в php класс для работы с базой данных mysql или хотя бы намекал на это в коде...

О блин! Революция произошла????
Так что бы я понимал, то есть вот эта строчка может заменить вот это

$dblocation = "localhost";
// Имя базы данных, на хостинге или локальной машине
$dbname = "dbname";
// Имя пользователя базы данных
$dbuser = "user";
// Пароль
$dbpasswd = "pass";
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx)
{
echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
exit();
}

if (! @mysql_select_db($dbname,$dbcnx) )
{
echo( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
exit();
}
@mysql_query("SET NAMES UTF8");

Так что ли получается?????

Спустя 9 минут, 14 секунд (3.07.2011 - 16:19) m4a1fox написал(а):
Invis1ble
Спасибо! Буду разбираться. Но много непоятных слов smile.gif . И как-то по другому все!

Спустя 4 минуты, 51 секунда (3.07.2011 - 16:23) m4a1fox написал(а):
Вот кое что начинает проясняться

$load= new mysqli("localhost","user","pas","dbname", 3306);
$result=$load->query("SELECT * FROM table");
$row=$result->fetch_array();
$show[] = $row['value1'];
$show[] = $row['value2'];

Спустя 8 минут, 54 секунды (3.07.2011 - 16:32) Invis1ble написал(а):
В продолжение мысли. Мы можем переопределить часть логики на свою, либо раширить функционал, например добавляем новый метод getAll(), который возвращает массив ассоциативных массивов:
class myPDO extends PDO {
public function getAll($query) {
$q = $this->query($query);
return $q->fetchAll();
}
}


$driver = 'mysql';
$database = 'test';
$host = 'localhost';
$username = 'root';
$passwd = 'root';
$dsn = $driver . ':dbname=' . $database . ';host=' . $host;

try {
$pdo = new myPDO($dsn, $username, $passwd);
$data = $pdo->getAll('select * from `table`'); // новый функционал
var_dump($data);
}
catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

Спустя 33 секунды (3.07.2011 - 16:33) m4a1fox написал(а):
Осталось дело за малым :) попытаться, подставть то что вытащил, вот сюда

private static $name = 'Max';
private static $pas = '123';

насколько я понимаю, надо использовать extends?

Спустя 1 минута, 10 секунд (3.07.2011 - 16:34) m4a1fox написал(а):
Invis1ble
Спасибо конечно, но я сейчас голову сломаю. Это вы не для моего уровня написали! wink.gif Я еще очень слаб в этом плане!

Спустя 4 минуты, 50 секунд (3.07.2011 - 16:39) m4a1fox написал(а):
Ха, а не получается подставить вот так

private static $name = $row['name'];
private static $pas = $row['pass'];


Спустя 2 минуты, 51 секунда (3.07.2011 - 16:42) Invis1ble написал(а):
m4a1fox
почему же... то что я написал - по сути тоже самое, что показал bulgakov, только более универсальней.
Цитата
насколько я понимаю, надо использовать extends?

смотря, чего ты хочешь добиться. Опиши для начала цель, которую ты хочешь достичь, ибо толком я так и непонял smile.gif

Спустя 8 минут, 12 секунд (3.07.2011 - 16:50) m4a1fox написал(а):
Invis1ble
Цель. Есть БД (oop), в ней есть таблица (admin). Там есть запись

+----+-------+------+--------+
| id | name | pass | encode |
+----+-------+------+--------+
| 2 | admin | 123 | |
+----+-------+------+--------+


Я хочу, что бы вот это сласс,

$name = true;

class class_Member
{

private static $name = 'Max';
private static $pas = '123';

function __construct($name) {
$name = !empty($_POST['log']) ? $_POST['log'] : 'Гость';
$pas = !empty($_POST['pas']) ? $_POST['pas'] : NULL;
$this->name = $name;
$this->pas = $pas;
}

function hello () {
if (isset ($_POST['ok'])){
if ($this->name == self::$name && $this->pas == self::$pas)
return header('Location: second.php');
else {
return '<font color="red">Вы ввели неверное имя или пароль</font>';
}
}

else
{
return NULL;
}
}
}


При получении данных из формы, принимал вместо вот этих значений

private static $name = 'Max';
private static $pas = '123';

Те что есть в БД. По сути авторизация.

Как вытащить данные из таблицы - я понял

$load= new mysqli("localhost","root","oracle","oop", 3306);
$result=$load->query("SELECT * FROM admin");
$row=$result->fetch_assoc();
$show[] = $row['name'];
$show[] = $row['pass'];

Но вот как подставить вот эти строки

$show[] = $row['name'];
$show[] = $row['pass'];

Вот сюда

private static $name = 'Max';
private static $pas = '123';

Я вот это не пойму, да и не получается если честно.

Спустя 6 минут, 45 секунд (3.07.2011 - 16:57) bulgakov написал(а):
Передавать в качестве параметров в конструктор
$name = $row['name'];
$pass = $row['pass'];

class someclass{
function __construct($name, $pass){
// some cod
}
}


$member = new someclass($name, $pass);

Как то так, очень кратко.

Спустя 5 минут, 58 секунд (3.07.2011 - 17:03) m4a1fox написал(а):

$load= new mysqli("localhost","root","oracle","oop", 3306);
$result=$load->query("SELECT * FROM admin");
$row=$result->fetch_assoc();
$show[] = $row['name'];
$show[] = $row['pass'];

Ах да, еще, почему-то цикл то не получается! Печалька. :blink:

Спустя 4 минуты, 40 секунд (3.07.2011 - 17:07) bulgakov написал(а):
Не пойму зачем вы переменные из одного массива передаете в другой? Ну используйте тот же ассоциативный массив который вы получили $row[] и данные из него присвойте двум переменным или же напрямую передавайте в конструктор.

Спустя 9 минут, 11 секунд (3.07.2011 - 17:17) m4a1fox написал(а):
Ладно с циклом разобрался. Как теперь дать классу понять, что згачение вот этих строк

private static $name = 'Max';
private static $pas = '123';

Брать из БД.

Спустя 4 минуты, 19 секунд (3.07.2011 - 17:21) bulgakov написал(а):
Цитата
Ладно с циклом разобрался. Как теперь дать классу понять, что згачение вот этих строк

Я не ясно написал?


class member{
private static $name = '';
private static $pas = '';

function __construct($name, $pas){
self::$name = $name;
self::$pas = $pas;
}

}



$member = new member($name, $pas); // $name и $pas переменные содержащие данные из базы, надеюсь как взять данные из базы показывать не надо?


Спустя 1 минута, 20 секунд (3.07.2011 - 17:22) Invis1ble написал(а):
Я так понимаю, что инетересуют по сути примеры реализации работы с БД на основе ООП подхода.
Авторизацию можно замутить примерно так:
class User {
private $pdo;

public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}

public function check(array $properties) {
$qWhere = array();
foreach ($properties as $name => $value)
$qWhere[] = '`' . $name . '` = ' . $this->pdo->quote($value);
$q = $this->pdo->query(
'select count(`id`) from `users` where ' . implode(' and ', $qWhere)
)
or die(print_r($this->pdo->errorInfo()));
return (bool)$q->fetchColumn();
}
}


$driver = 'mysql';
$database = 'database';
$host = 'localhost';
$username = 'root';
$passwd = 'root';
$dsn = $driver . ':dbname=' . $database . ';host=' . $host;

try {
$pdo = new PDO($dsn, $username, $passwd);
$user = new User($pdo);
if (isset($_POST['login'], $_POST['password'])) {
$result = $user->check(array('login' => $_POST['login'], 'password' => md5($_POST['password'])));
echo $result ? 'Success' : 'Fail';
}
}

catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

Спустя 20 секунд (3.07.2011 - 17:23) m4a1fox написал(а):
bulgakov
Эка, вы злитись! Не надо! Я только учусь. ПОнимаю вас прекрасно! Бесит, когда человек, спарашивает, вы ему отвечаете, а он не делает как надо! Но я только учусь! Так что не серчайте!

Спустя 1 минута, 16 секунд (3.07.2011 - 17:24) bulgakov написал(а):
Цитата
Эка, вы злитись! Не надо! Я только учусь

Я не серчаю вам показалось)

Спустя 5 минут, 6 секунд (3.07.2011 - 17:29) m4a1fox написал(а):
bulgakov
А ну тогда все нормально! Ладно, поехали дальше.
Принцип, я понял исходя вот из этого

class member{
private static $name = '';
private static $pas = '';

function __construct($name, $pas){
self::$name = $name;
self::$pas = $pas;
}

}


Но позвольте, а как же, вот эти строки в __construct

function __construct($name, $pass) {
$name = !empty($_POST['name']) ? $_POST['name'] : 'Гость';
$pass = !empty($_POST['pass']) ? $_POST['pass'] : NULL;
self::$name = $name;
self::$pass = $pas;
}
а точнее я вот про эти

$name = !empty($_POST['name']) ? $_POST['name'] : 'Гость';
$pass = !empty($_POST['pass']) ? $_POST['pass'] : NULL;

Как с ними быть?

Спустя 6 минут, 4 секунды (3.07.2011 - 17:35) Invis1ble написал(а):
m4a1fox
Цитата
Как с ними быть?

я думаю, не стоит передавать в конструктор глобальные переменные

Спустя 47 секунд (3.07.2011 - 17:36) m4a1fox написал(а):
Invis1ble
Хорошо! Допустим. Но что с ними то делать. Как то ж данные должны попасть в класс?!

Спустя 3 минуты, 38 секунд (3.07.2011 - 17:39) Invis1ble написал(а):
m4a1fox
сорри, я немного неправильно выразился. Передавать то их можно, но не так. Я имел ввиду, что не стоит работать напрямую с глобальными переменными
код конструктора:
function __construct($name, $pas){
self::$name = $name;
self::$pas = $pas;
}

создаем объект:
$name = !empty($_POST['name']) ? $_POST['name'] : 'Гость';
$pass = !empty($_POST['pass']) ? $_POST['pass'] : NULL;
$obj = new Class($name, $pass);

Спустя 4 секунды (3.07.2011 - 17:39) Krevedko написал(а):
почему тут, а не в разделе по ООП ?

Спустя 2 минуты, 10 секунд (3.07.2011 - 17:42) bulgakov написал(а):
Вам нужно передать в класс из базы переменные с которыми будут сверятся данные из поста, значит вам в класс надо передавать переменные и из базы и из поста, а уже внутри сравнить их друг с другом... я уже начинаю путаться... сделайте отдельно метод проверки, а в конструктор передавайте 4 значененя, логин, пароль из базы и логин пароль из поста, как вариант, внутри класса например тоже 4 свойства для логина пароля из базы и логин пароль из поста. И метод их сверки. Хотя может есть и более простые методы.

Спустя 1 минута, 3 секунды (3.07.2011 - 17:43) bulgakov написал(а):
Цитата
почему тут, а не в разделе по ООП ?

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

Спустя 2 минуты, 12 секунд (3.07.2011 - 17:45) Invis1ble написал(а):
bulgakov
Цитата
Хотя может есть и более простые методы.

имхо, да. глянь метод check() который я наваял в предыдущем коде. Преимущество: можно написать некий базовый класс, от которого будут наследоваться дочерние, реализующие логику различных сущностей, таких как Юзер, Заказ, и т.д. но метод check() для всех можно оставить прежним и лишь менять динамически имя таблицы

Спустя 4 минуты, 17 секунд (3.07.2011 - 17:49) m4a1fox написал(а):
bulgakov
Цитата
Вам нужно передать в класс из базы переменные с которыми будут сверятся данные из поста, значит вам в класс надо передавать переменные и из базы и из поста, а уже внутри сравнить их друг с другом... я уже начинаю путаться... сделайте отдельно метод проверки, а в конструктор передавайте 4 значененя, логин, пароль из базы и логин пароль из поста, как вариант, внутри класса например тоже 4 свойства для логина пароля из базы и логин пароль из поста. И метод их сверки. Хотя может есть и более простые методы.

Вот вроде что то похожее сделал!
Собственно вот

class class_Member
{
function __construct($name, $pass) {
$name = !empty($_POST['name']) ? $_POST['name'] : 'Гость';
$pass = !empty($_POST['pass']) ? $_POST['pass'] : NULL;
$this->name = $name;
$this->pass = $pass;
}

function hello ($name, $pass) {
if (isset ($_POST['ok'])){
if ($this->name == $name && $this->pass == $pass)
header('Location: second.php');
else {
return '<font color="red">Вы ввели неверное имя или пароль</font>';
}
}

else
{
return NULL;
}
}
}


Далее вот такой файлик

$load= new mysqli("localhost","root","oracle","oop", 3306);
$result=$load->query("SELECT * FROM admin");
while ($row=$result->fetch_assoc())
{
$name1 = $row['name'];
$pass2 = $row['pass'];
}

А на самой странице

$member = new class_Member($name1, $pass2);
echo $member->hello($name1, $pass2);
.
Блин, такая ересть получается. Что то дебри и только они!

Спустя 17 секунд (3.07.2011 - 17:49) Krevedko написал(а):
Цитата (bulgakov @ 3.07.2011 - 14:43)
Цитата
почему тут, а не в разделе по ООП ?

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

ты сам себе ответил. в ооп разделе можно и начинающим писать. для того он и создан

Спустя 4 минуты, 8 секунд (3.07.2011 - 17:54) m4a1fox написал(а):
Krevedko
А переместить раздел можно?

Спустя 2 минуты, 44 секунды (3.07.2011 - 17:56) bulgakov написал(а):
Может это натолкнет на какие-то мысли? А то правда я уже и сам запутался в том что ты хочеш... надо стремиться к простоте а ты все усложняеш...

Спустя 10 минут, 54 секунды (3.07.2011 - 18:07) m4a1fox написал(а):
bulgakov
Я не специально sad.gif . И то правда, как то сложно.... так. еще раз.
Надо(дано):
1. Отправить запрос в БД через форму методом POST.
2. Получить данные, обработать.
3. Проверить, есть ли такие в БД.
4. Если да - то пропустить иначе - ошибка.

Спустя 2 минуты, 15 секунд (3.07.2011 - 18:09) m4a1fox написал(а):
Так-с. Все выдохнули. Получилось! Кому интересно - предоставить пезультат?

Спустя 4 минуты, 36 секунд (3.07.2011 - 18:14) Invis1ble написал(а):
Цитата
Кому интересно - предоставить пезультат?

а ну

Спустя 5 минут, 38 секунд (3.07.2011 - 18:20) m4a1fox написал(а):
Invis1ble
Глядите. Выкладываю все файлы, только не бить :)
class.mysql.php

$name1 = NULL;
$pass1 = NULL;

if (isset ($_POST['ok']))
{
$name = !empty($_POST['name']) ? trim($_POST['name']) : NULL;
$pass = !empty($_POST['pass']) ? trim($_POST['pass']) : NULL;

}
else
{
$name = TRUE;
$pass = TRUE;
}
$load= new mysqli("localhost","root","oracle","oop", 3306);
$result=$load->query("SELECT * FROM admin
WHERE `name` = '"
.$name."'
AND `pass` = '"
.$pass."'" );
while ($row=$result->fetch_assoc())
{
$name1 = $row['name'];
$pass1 = $row['pass'];
}


Далее
class.member.php

$name = true;
$pass = true;

class class_Member
{
function __construct($name, $pass) {
$this->name = $name;
$this->pass = $pass;
}

function hello ($name, $pass) {
if (isset ($_POST['ok'])){
if ($this->name == $name && $this->pass == $pass)
header('Location: second.php');
else {
return '<font color="red">Вы ввели неверное имя или пароль</font>';
}
}

else
{
return NULL;
}
}
}


НУ и собственно index.php

<div class="content">
<?php
$member = new class_Member($name, $pass);
echo $member->hello($name1, $pass1);
?>

<form action="" method="post">
<
table border="0">
<
tr>
<
td>
Логин:
</
td>
<
td>
<
input type="text" name="name"/>
</
td>
</
tr>
<
tr>
<
td>
Пароль:
</
td>
<
td>
<
input type="password" name="pass" />
</
td>
</
tr>

<
tr>
<
td>

</
td>
<
td>
<
input type="submit" name="ok" />
</
td>
</
tr>
</
table>
</
form>
</
div>

Спустя 1 минута, 58 секунд (3.07.2011 - 18:22) m4a1fox написал(а):
А-н нет! Включаем заднию. Уже не работает! Блин! Ну как так? Если форма пуста то все проходит.

Спустя 3 минуты, 46 секунд (3.07.2011 - 18:25) m4a1fox написал(а):
Представьте, работает если только вот так

$name = !empty($_POST['name']) ? trim($_POST['name']) : 'Гость';
$pass = !empty($_POST['pass']) ? trim($_POST['pass']) : NULL;
,
то есть если так

$name = !empty($_POST['name']) ? trim($_POST['name']) : NULL;
$pass = !empty($_POST['pass']) ? trim($_POST['pass']) : NULL;

То можно ничего не вводить, нажимаем отправить, и все. Идет переадресация.

Спустя 16 секунд (3.07.2011 - 18:26) Invis1ble написал(а):
Цитата
if (isset ($_POST['ok'])){

я ж говорил, не надо работать напрямую с постом
Цитата
$name = true;
$pass = true;

зачем тут?
Цитата
header('Location: second.php');

не надо вообще отсылать заголовки из метода
Цитата
return '<font color="red">Вы ввели неверное имя или пароль</font>';

лучше вернуть false, а в обработчике проверять на false
Цитата
else
{
$name = TRUE;
$pass = TRUE;
}

бред
Цитата
$load= new mysqli("localhost","root","oracle","oop", 3306);
$result=$load->query("SELECT * FROM admin
WHERE `name` = '".$name."'
AND `pass` = '".$pass."'" );
while ($row=$result->fetch_assoc())
{
$name1 = $row['name'];
$pass1 = $row['pass'];
}

зачем выполнять лишнюю работу? лучше засунуть в блок if

Спустя 1 минута, 44 секунды (3.07.2011 - 18:27) m4a1fox написал(а):
Invis1ble
Ясно! Сечас буду исправлять. Подскажете? smile.gif

Спустя 3 минуты, 20 секунд (3.07.2011 - 18:31) m4a1fox написал(а):
Цитата
а в обработчике проверять на false

А как в обработчике проверить? Что типо того, что вернула функция?

Спустя 1 минута, 13 секунд (3.07.2011 - 18:32) Invis1ble написал(а):
m4a1fox
Цитата
А как в обработчике проверить? Что типо того, что вернула функция?

ну да
вместо заголовка return true, вместо echo '<p....' return '<font color="red">Вы ввели неверное имя или пароль</font>'; - return false;

Спустя 3 минуты, 3 секунды (3.07.2011 - 18:35) m4a1fox написал(а):
Invis1ble
Ну про функция я понял, но вот где, сделать перевод на друю станицу, не понимаю, к сожалению!

Спустя 2 минуты, 38 секунд (3.07.2011 - 18:38) m4a1fox написал(а):
Не могу понять как прописать скрипт, что бы он смотрел функцию и при определенном значении выводи то или иное действе?!

Спустя 1 минута (3.07.2011 - 18:39) Invis1ble написал(а):
m4a1fox
где-где.... в обработчике:
if ($member->hello($name1, $pass2))
header('Location: script.php'); // авторизация успешна
else
die('ЖОПА!!!!'); // авторизация провалена

Спустя 18 минут, 34 секунды (3.07.2011 - 18:57) m4a1fox написал(а):
Ну в общем где-то так
class.member.php

class class_Member
{
function __construct($name, $pass) {
$this->name = $name;
$this->pass = $pass;
}

function hello ($name1, $pass1) {
if ($this->name == $name1 && $this->pass == $pass1)
return TRUE;
else {
return FALSE;
}
}
}



файл class.mysql.php

$name1 = NULL;
$pass1 = NULL;

if (isset($_POST['ok']))
{
$name = !empty($_POST['name']) ? trim($_POST['name']) : 'Гость';
$pass = !empty($_POST['pass']) ? trim($_POST['pass']) : NULL;

}
else
{
$name = TRUE;
$pass = TRUE;
}
$load= new mysqli("localhost","root","oracle","oop", 3306);
$result=$load->query("SELECT * FROM admin
WHERE `name` = '"
.$name."'
AND `pass` = '"
.$pass."'" );
while ($row=$result->fetch_assoc())
{
$name1 = $row['name'];
$pass1 = $row['pass'];
}

И сам index.php

<div class="content">
<?php
$member = new class_Member($name, $pass);
if (!empty($_POST['ok'])){
if ($member->hello($name1, $pass1))
header('Location: second.php'); // авторизация успешна
else
echo '<font color="red">Вы ввели неверное имя или пароль</font>'; // авторизация провалена
}
?>

<form action="" method="post">
<
table border="0">
<
tr>
<
td>
Логин:
</
td>
<
td>
<
input type="text" name="name"/>
</
td>
</
tr>
<
tr>
<
td>
Пароль:
</
td>
<
td>
<
input type="password" name="pass" />
</
td>
</
tr>

<
tr>
<
td>

</
td>
<
td>
<
input type="submit" name="ok" />
</
td>
</
tr>
</
table>
</
form>
</
div>

Спустя 5 минут, 17 секунд (3.07.2011 - 19:02) Invis1ble написал(а):
m4a1fox
ну это уже немножко лучше. Но....
Теперь взгялни на свой код, в частности на класс. Ничего не смущает?
Смысл создавать класс, если все что он делает - по сути выполняется одной строчкой?
if ($name == $name1 && $pass == $pass1)
header('Location: second.php'); // авторизация успешна
else
echo '<font color="red">Вы ввели неверное имя или пароль</font>'; // авторизация провалена
:)

Спустя 2 минуты, 22 секунды (3.07.2011 - 19:05) m4a1fox написал(а):
Invis1ble
Блин....Ну тогда весь смысл в ООП пропадает!

Спустя 57 секунд (3.07.2011 - 19:06) m4a1fox написал(а):
m4a1fox
Ладно! Вечером продолжу! Спасибо! Но это еще не конец.

Спустя 2 минуты, 56 секунд (3.07.2011 - 19:09) Invis1ble написал(а):
m4a1fox
Цитата
тогда весь смысл в ООП пропадает!

отож.
весь смак ООП, имхо - это наследование
посмотри на код метода check(), который я написал несколько постов назад
теперь попробуй понять логику и глубину (представь, что вместо `user` стоит '`' . $this->table . '`') и какую выгоду может сулить такой подход
как поймешь смысл - напиши

Спустя 12 часов, 19 секунд (4.07.2011 - 07:09) Invis1ble написал(а):
Вот например можно примерно так сделать:
class SomeClass {
private $pdo;

public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}

public function __set($name, $value) {
$this->$name = $value;
}

public function count(array $properties) {
foreach ($properties as $name => $value)
$qWhere[] = '`' . $name . '` = ' . $this->pdo->quote($value);

$q = $this->pdo->query(
'SELECT COUNT(*)
FROM `'
. $this->table . '`
'
. (isset($qWhere) ? 'WHERE ' . implode(' AND ', $qWhere) : '')
);

return $q->fetchColumn();
}
}


$driver = 'mysql';
$database = 'database';
$host = 'localhost';
$username = 'root';
$passwd = 'root';
$dsn = $driver . ':dbname=' . $database . ';host=' . $host;

try {
if (isset($_POST['login'], $_POST['password'])) {
$pdo = new PDO($dsn, $username, $passwd);
$object = new SomeClass($pdo);
$object->table = 'users';
$result = $object->count(array('login' => $_POST['login'], 'password' => md5($_POST['password'])));
echo $result ? 'Success' : 'Fail';
}
}

catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}

т.е. мы можем создать объект и менять по мере необходимости table в зависимости от задачи.
$object = new SomeClass($pdo);

$object->table = 'users';
$result = (bool)$user->count(array('login' => $_POST['login'], 'password' => md5($_POST['password']))) // авторизация;

$object->table = 'goods';
$result = $object->count(array()); // количество товаров в интернет-магазине
$result = $object->count(array('category_id' => 15)); // количество товаров в интернет-магазине для категории с id = 15

$object->table = 'orders';
$result = $object->count(array('user_id' => 15)); // колличество заказов, сделанных юзером с id = 15

Все это можно развивать и допиливать, это довольно примитивный пример.
Например, можно написать наследников
class User extends SomeClass {
public function __construct(PDO $pdo) {
parent::__construct($pdo);
$this->table = 'users';
}
}


// ........

$user = new User($pdo);
$result = (bool)$user->check(array('login' => $_POST['login'], 'password' => md5($_POST['password']))); // авторизация

и т.д. и т.п.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.