[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс для вставки данных
m4a1fox
Господа, доброго дня. Подскажите, пожалуйста, вот пытаюсь при помощи магии и учебников и гугла, написать класс для вставки данных в таблицу. Подскажите, у кого есть время и терпение, буду весьма признателен!? У меня уже есть класс для выборки данных, а вот для insert'a нет.



Спустя 4 минуты, 59 секунд (7.07.2011 - 14:33) Winston написал(а):
А зачем тебе класс для insert'a? Мне кажется там одного метода хватит?
Цитата (m4a1fox @ 7.07.2011 - 14:28)
Подскажите, у кого есть время и терпение, буду весьма признателен!?

И я присоединюсь т.к. мне тоже интересно, как это правильно сделать.

Спустя 5 минут, 19 секунд (7.07.2011 - 14:39) m4a1fox написал(а):
PHPprogramer
Как я понимаю, метод - это не функция, значит если Вы написали слово метод, то я на автомате принимаю это, как то, что есть class.
Вот собственно класс, кот. у меня есть

class Member extends connect_Db {
function return_user() {
$sql = "SELECT * FROM `login`";
$res = $this->sql($sql);
return $res;
}
}


class showLogin extends Member {
function show_user() {
$res = $this->return_user();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}
else {
echo 'String in db is empty';
}
return $name;
}
}

$user = new showLogin;

Как я только что понял, это не верно, необходимо все писать в одном классе... так же получается? А потом просто вытаскивать методы и все...

Спустя 6 минут, 12 секунд (7.07.2011 - 14:45) neadekvat написал(а):
А я вот не понимаю, что вы хотите сделать.
Чем вас не устраивает mysql_query("INSERT INTO ...") ? А если устраивает - то как-то подробнее надо описывать, зачем вам класс и что вы от него хотите.

Спустя 28 секунд (7.07.2011 - 14:45) Winston написал(а):
Цитата (m4a1fox @ 7.07.2011 - 14:39)
Как я только что понял, это не верно, необходимо все писать в одном классе... так же получается? А потом просто вытаскивать методы и все...

Как мне кажется то это не верно. Для каждого метода свой класс писать :D ???
Почему бы так не написать ?
Свернутый текст
class Member extends connect_Db {
public function return_user() {
$sql = "SELECT * FROM `login`";
$res = parent :: sql($sql);
return $res;
}

public function show_user() {
$res = $this->return_user();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}
else {
echo 'String in db is empty';
}
return $name;
}
}


$member = new Member;
echo $member -> return_user();
echo $member -> show_user();

И в дочернем классе я думаю вместо такого $this->sql($sql);
Лучше писать так parent :: sql($sql);
Чтобы было сразу видно что к чему

Спустя 11 минут, 27 секунд (7.07.2011 - 14:57) tatti написал(а):
вот тоже интересно можно ли как-то допустим по колл.элементов массива, определить имена колонок в таблице, чтоб ну вообще под всё подходило?

Спустя 1 минута, 19 секунд (7.07.2011 - 14:58) neadekvat написал(а):
PHPprogramer, не соглашусь.

Я вообще против наследования классов, состоящий только из настроек подключений и классов работы с базой данных.
Это же разные сущности. Один класс работает с базой данных, а второй класс работает с пользователями. И вот второй класс просто пользуется услугами первого. Поэтому надо либо делать методы класс работы с бд статическими (лучше так), либо передавать объект этого класса в конструктор другим классам.

Спустя 1 минута, 39 секунд (7.07.2011 - 15:00) m4a1fox написал(а):
PHPprogramer
Поддерживаю... вот так оформил

class showLogin extends connect_Db {

function return_user() {
$sql = "SELECT * FROM `login`";
$res = $this->sql($sql);
return $res;
}


function show_user() {
$res = $this->return_user();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}
else {
echo 'String in db is empty';
}
return $name;
}
}

$user = new showLogin;



Для вас neadekvat, меня полностью устраивает
Цитата
mysql_query("INSERT INTO ...")

Я сейчас хочу потихоньку в ооп разобраться. По сути, надо понять 4 метода:
  • 1. Выбрать
  • 2. Обновить
  • 3. Занести
  • 4. Удалить

Класс, как выбрать - это я понял. Следующий на очереди - класс Занести.



Спустя 1 минута, 8 секунд (7.07.2011 - 15:01) m4a1fox написал(а):
neadekvat
Цитата
Поэтому надо либо делать методы класс работы с бд статическими (лучше так)

Вот так и буду делать.

Спустя 1 минута, 50 секунд (7.07.2011 - 15:03) neadekvat написал(а):
Цитата (m4a1fox @ 7.07.2011 - 16:01)
Вот так и буду делать.

При этом наследовать ничего не надо.

Спустя 7 минут, 17 секунд (7.07.2011 - 15:10) m4a1fox написал(а):
neadekvat
Цитата
При этом наследовать ничего не надо.

А вот с этим проблемка.... а как тогда подключение к БД?

Спустя 5 минут, 13 секунд (7.07.2011 - 15:15) Winston написал(а):
Цитата (m4a1fox @ 7.07.2011 - 15:10)
А вот с этим проблемка.... а как тогда подключение к БД?

Написать класс, создать объект, вот и будет тебе подключение.

Спустя 8 минут, 41 секунда (7.07.2011 - 15:24) m4a1fox написал(а):
PHPprogramer
ну так тоже можно, но я наследованием решил сделать?!

Спустя 59 секунд (7.07.2011 - 15:25) Winston написал(а):
Ну говорят же что наследование здесь не нужно.

Спустя 6 минут, 50 секунд (7.07.2011 - 15:32) m4a1fox написал(а):
PHPprogramer
Знаю, что говорят. Тогда как без наследования?!
Вот класс для соединения с БД

private $connection;

function __construct() {
$this->open_connection();
//echo "Connection is set";
}

private function open_connection() {
$this->connection = mysql_connect($this->DB_HOST, $this->DB_USER, $this->DB_PASS);
if(!$this->connection) {
die("Database connection faild: ".mysql_error());
}
else {
$db_select = mysql_select_db($this->DB_NAME);
if(!$db_select) {
die ("Database selected faild: ".mysql_error());
}
}

mysql_query("set names utf8") or die ("set names utf8 faild");
}

public function sql ($query) {
$result = mysql_query($query, $this->connection);
if(!result) {
die("Database query failed: ".mysql_error());
}
return $result;
}
}


$db = new connect_Db;

класс настроек default.php

class defaultVar extends Debug {
var $BASE_URL = "localhost/oop";
var $DB_HOST = "localhost";
var $DB_USER = "user";
var $DB_PASS = "";
var $DB_NAME = "oop";
}


И соббственно класс select'a

class showLogin extends connect_Db {

private function return_user() {
$sql = "SELECT * FROM `login`";
$res = $this->sql($sql);
return $res;
}


function show_user() {
$res = $this->return_user();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}
else {
echo 'String in db is empty';
}
return $name;
}
}

$user = new showLogin;


Объясните, как туту быть без наследования?!

Спустя 7 минут, 29 секунд (7.07.2011 - 15:39) Winston написал(а):
Мне кажется, что метод sql в классе соединение вообще не к месту.
Цитата (m4a1fox @ 7.07.2011 - 15:32)
класс настроек default.php

Зачем создавать класс настроек, если можно создать файл в котором хранить константы HOST, USER и т.д. и при создании объекта передавать их в конструктор класса соединения.

Спустя 1 минута, 3 секунды (7.07.2011 - 15:40) m4a1fox написал(а):
PHPprogramer
Согласен! Попробую переделать!?

Спустя 3 минуты, 35 секунд (7.07.2011 - 15:44) neadekvat написал(а):
Цитата (m4a1fox @ 7.07.2011 - 16:32)
Объясните, как туту быть без наследования?!

Любой код больше 50-ти строк можно написать как минимум двумя способами. Умей отказывать от своего кода и видеть другие варианты.

class db
{
protected $BASE_URL = "localhost/oop";
protected $DB_HOST = "localhost";
protected $DB_USER = "user";
protected $DB_PASS = "";
protected $DB_NAME = "oop";

protected static $connection;


function __construct() {
if ( ! self::$connection)
$this->open_connection();
//echo "Connection is set";
}

private function open_connection() {
$this->connection = mysql_connect($this->DB_HOST, $this->DB_USER, $this->DB_PASS);
if(!$this->connection) {
die("Database connection faild: ".mysql_error());
}
else {
$db_select = mysql_select_db($this->DB_NAME);
if(!$db_select) {
die ("Database selected faild: ".mysql_error());
}
}

mysql_query("set names utf8") or die ("set names utf8 faild");
}

public static function sql ($query) {
$result = mysql_query($query, $this->connection);
if(!result) {
die("Database query failed: ".mysql_error());
}
return $result;
}
}


$db = new db;

class showLogin
{
private function return_user() {
$sql = "SELECT * FROM `login`";
$res = db::sql($sql);
return $res;
}


public function show_user() {
$res = $this->return_user();
if(mysql_num_rows($res) > 0) {
while($row = mysql_fetch_assoc($res)) {
$name[] = $row;
}
}
else {
echo 'String in db is empty';
}
return $name;
}
}

$user = new showLogin;

Спустя 3 минуты, 43 секунды (7.07.2011 - 15:48) Winston написал(а):
Здесь обращаешься к статической переменной.
Цитата (neadekvat @ 7.07.2011 - 15:44)
( ! self::$connection)

А здесь нет
Цитата (neadekvat @ 7.07.2011 - 15:44)
$this->connection

Почему так ?

Спустя 5 минут, 15 секунд (7.07.2011 - 15:53) neadekvat написал(а):
PHPprogramer, потому что я лишь показал, как использовать без наследования, но весь код не перечитывал.
Верно будет обращаться как к статическим данным.

Спустя 4 минуты, 17 секунд (7.07.2011 - 15:57) m4a1fox написал(а):
neadekvat
Да и как к статической, все равно ошибка?!



Спустя 1 минута, 59 секунд m4a1fox написал(а):
А ну ка... для меня тупого, чем плохо наследование?!

Спустя 12 минут, 4 секунды (7.07.2011 - 16:09) neadekvat написал(а):
Цитата (m4a1fox @ 7.07.2011 - 16:57)
Да и как к статической, все равно ошибка?!

Я же сказал - это пример. Код прошерсти и исправь.

Цитата (m4a1fox @ 7.07.2011 - 16:57)
А ну ка... для меня тупого, чем плохо наследование?!

Оно не плохо. Оно хорошо. Вообще все хорошо, когда к месту. Здесь не к месту. Это я уже объяснял.
Цитата (neadekvat @ 7.07.2011 - 15:58)
Это же разные сущности. Один класс работает с базой данных, а второй класс работает с пользователями. И вот второй класс просто пользуется услугами первого


Спустя 1 час, 6 минут, 28 секунд (7.07.2011 - 17:16) m4a1fox написал(а):
В общем где то бред но он работает :)

function insert_user($post) {
$sql = "INSERT INTO `login` SET `name` = '".$post['name']."',
`pass` = '"
.$post['pass']."',
`encode` = '"
.$post['email']."'
"
;
//echo $sql;
$this->sql($sql);
return true;
}

Спустя 2 минуты, 49 секунд (7.07.2011 - 17:18) neadekvat написал(а):
*всплеснул руками*
Цитата (m4a1fox @ 7.07.2011 - 18:16)
$this->sql($sql);

Это говорит о прямом наследовании.

Как об стену горох.

Спустя 2 минуты, 20 секунд (7.07.2011 - 17:21) m4a1fox написал(а):
neadekvat
А как тогда?????????? Я уже в догадках теряюсь?!

Спустя 2 минуты, 6 секунд (7.07.2011 - 17:23) neadekvat написал(а):
Цитата (m4a1fox @ 7.07.2011 - 18:21)
А как тогда?????????? Я уже в догадках теряюсь?!

Я показал, как. Там нет наследования. Нет! Но надо заменить обращения внутри класса бд на self::, а обращения к этому классу из класса работы с пользователями на db::sql

Спустя 1 минута, 46 секунд (7.07.2011 - 17:25) m4a1fox написал(а):
neadekvat
Спасибо вам огромное за подсказки и терпение, но мне кажется, так как вы предложили для меня еще очень сложно.... извините.

Спустя 9 минут, 29 секунд (7.07.2011 - 17:34) neadekvat написал(а):
Цитата (m4a1fox @ 7.07.2011 - 18:25)
Спасибо вам огромное за подсказки и терпение, но мне кажется, так как вы предложили для меня еще очень сложно.... извините.

Я тебе скажу один вещь, ты только не обижайся.
Если для тебя то, что я объясняю, сложно - то рано тебе вообще в ООП лезть.
Ты не можешь сделать обычную, элементарную связь между классами, но уже лезешь в наследование! Нельзя так. Оставь ты ООП пока. Начни с азов, а не с Ирбиса или форума.

Спустя 5 минут, 20 секунд (7.07.2011 - 17:39) m4a1fox написал(а):
neadekvat
хорошо! Наверно так и сделаю!

Спустя 16 минут, 52 секунды (7.07.2011 - 17:56) ИНСИ написал(а):
neadekvat по твоему коду, немного комментов:

1. Подключение к БД лучше вывести с класса в константы, либо переменные.
2. Для вывода ошибок лучше сделать отдельный метод.
3. Сделать возможность управлять выводом ошибок.

m4a1fox не стоит бросать, просто надо прислушиваться к более опытным (имею в виду с чего начинать), а не лезть сразу в сложные моменты smile.gif

А как тогда ты выучишь ООП, если не будешь пытаться учить и тестить? Дерзай!
Быстрый ответ:

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