[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Передача данных и запись в БД
SiFaust
Эх, помню как то md5 сказал "Не умеешь срать - не мучай жопу". Видимо это мой случай, но не помучать "жопу" не могу )

Вобщем сколько не читал статьи по ООП и не читал учебник до меня так и не дошло как передать что то через простейшую форму и записать это в БД.
Там само собой это не написано.
Я честно насиловал моск очень долгое время и вышло что то этакое:
Код
<?
class Test
{
function Add()
{
require("connect_sql.php");
$script = $db->Execute("Update Limitation SET [cap]='$this->cap',[lvl]='$this->lvl',[nlvl]='$this->nlvl'");
}
}
$add = new Test;
$add->cap = $_POST['cap'];
$add->lvl = $_POST['lvl'];
$add->nlvl = $_POST['nlvl'];
$add->Add();
?>
//Далее идет хтмл со всеми формами...


Выдает вот такую вот ошибку Fatal error: Call to a member function Execute() on a non-object

Подскажите мне дураку в чем моя ошибка, подтолкните так сказать к решению проблемы, очень прошу.



Спустя 2 дня, 14 часов, 11 минут, 15 секунд (26.08.2008 - 15:35) SiFaust написал(а):
Стыдно но все еще не понял почему так) Буду благодарен если кто обьяснит)

Спустя 11 минут, 14 секунд (26.08.2008 - 15:46) zona7o написал(а):
тебе внутри класса Test объявить переменные:
Код
class Test
{
     var $cap;
     var $lvl;
     var $nlvl;
    
     function Add()
     {
          require("connect_sql.php");
          $script = $db->Execute("Update Limitation SET [cap]='$this->cap',[lvl]='$this->lvl',[nlvl]='$this->nlvl'");
     }
}

Спустя 36 минут, 32 секунды (26.08.2008 - 16:23) SiFaust написал(а):
Всеравно та же ошибка что и раньше... Может подключение к БД какое то особенное должно быть?

Спустя 5 минут, 21 секунда (26.08.2008 - 16:28) Viking написал(а):
$db не является объектом, где оно у тебя где объявляется? в connect_sql.php ? значит там ошибка

Спустя 28 минут, 18 секунд (26.08.2008 - 16:56) zona7o написал(а):
Содержимое connect_sql.php покажешь?

Спустя 1 час, 59 минут, 57 секунд (26.08.2008 - 18:56) SiFaust написал(а):
Viking, обьявил $db обьектом, итог тот же.


Содержимое connect_sql.php:
Код
<?php
    $dblocation = "localhost";
    $dbname = "Turney";
    $dbuser = "root";
    $dbpasswd = "";
    $dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
    if (!$dbcnx)
    {
      echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому
                корректное отображение страницы невозможно.</P>" );
      exit();
    }
    if (!@mysql_select_db($dbname, $dbcnx))
    {
      echo( "<P>В настоящий момент база данных не доступна, поэтому
                корректное отображение страницы невозможно.</P>" );
      exit();
    }
    ?>

Спустя 47 минут, 32 секунды (26.08.2008 - 19:44) Viking написал(а):
слишком тихо объявил значит, в ошибке ясно сказано, что он не объект

Спустя 22 минуты, 47 секунд (26.08.2008 - 20:07) SiFaust написал(а):
В єтот раз кричал и обьявлял как можно громче)) Жаль оно меня не услышало )))
Код
<?
class Test
{
    var $dblocation = "localhost";
    var $dbname = "Turney";
    var $dbuser = "root";
    var $dbpasswd = "";
    var $db;
    var $cap;
    var $lvl;
    var $nlvl;
    var $dbcnx;
    var $dbsel;
     function Sql()
    {
    $this->dbcnx->mysql_connect($this->dblocation,$this->dbuser,$this->dbpasswd);
    $this->dbsel->mysql_select_db($this->dbname, $this->dbcnx);
    }
     function Add()
     {
           $this->Sql();
          $this->db->Execute("Update Limitation SET [cap]='$this->cap',[lvl]='$this->lvl',[nlvl]='$this->nlvl'");
     }
}
$add = new Test;
$add->cap = 5;
$add->lvl = 5;
$add->nlvl = 5;
$add->Add();
?>

Спустя 25 минут, 57 секунд (26.08.2008 - 20:33) Viking написал(а):
оно тебя просто не поняло, и это не удивительно
ты объявляешь $db СВОЙСТВОМ (переменной) класса тест
при этом ты вызываешь метод Execute ОБЪЕКТА $db , а он у тебя не объект а переменная и такого метода у него нет и быть не может
видимо ты эту строчку скопировал откудато потеряв контекст

Спустя 1 час, 58 минут, 7 секунд (26.08.2008 - 22:31) zona7o написал(а):
а где метод Execute?..

и ещё такая идея - использовать наследование либо полиморфизм. не знаю что лучше.
если я правильно понимаю наследование, то Test extends db позволит классу Тест использовать Execute метод родительского класса дб.

хм.. подождите, я что-то вообще не вижу здесь класса DB biggrin.gif

Спустя 19 минут, 53 секунды (26.08.2008 - 22:51) SiFaust написал(а):
Спасибо всем, буду думать дальше ))

Всетаки логика ООП для меня сложна и пока малопонятна, такие легкие вещи становятся такими сложными...
Основывался я на эту статью, так как даже не представлял как работать с БД в ОПП, но видимо очень много недопонял)))

Спустя 19 минут, 55 секунд (26.08.2008 - 23:11) Viking написал(а):
Цитата(zona7o @ 26.8.2008, 23:31) [snapback]47061[/snapback]
а где метод Execute?..

и ещё такая идея - использовать наследование либо полиморфизм. не знаю что лучше.
если я правильно понимаю наследование, то Test extends db позволит классу Тест использовать Execute метод родительского класса дб.

хм.. подождите, я что-то вообще не вижу здесь класса DB biggrin.gif

ты так человека еще больше запутаешь
тут дб это объект, т.е. экземпляр неизвестного класса, а не сам класс
проблема как раз в том что самого класса, чьим объектом является дб тут и вовсе нет

Спустя 1 минута, 13 секунд (26.08.2008 - 23:12) Viking написал(а):
Цитата(SiFaust @ 26.8.2008, 23:51) [snapback]47063[/snapback]
Спасибо всем, буду думать дальше ))

Всетаки логика ООП для меня сложна и пока малопонятна, такие легкие вещи становятся такими сложными...
Основывался я на эту статью, так как даже не представлял как работать с БД в ОПП, но видимо очень много недопонял)))

вот в той статье объявление дб
Код
Напомним, что параметр $db – это экземпляр класса DataBase. Можно поступить и так:

<?php
public function setDb($db)
{
    $this->db = new DataBase(‘login’,’password’,’host’,’database’); // Параметры – значения подключения к базе данных.
}
?>

Спустя 2 часа, 38 минут, 1 секунда (27.08.2008 - 01:50) SiFaust написал(а):
Огромное всем спасибо, я попутал свойства с обьектам и получилась каша)

Viking, проблема в том что я не могу понять КАК это работает, вот в процедурном все просто, для БД есть свои команды, такая то команда посылает запрос, такая то соединяет, а как это все работает в ООП я просто не понимаю ((
Ни в одной книжке, ни в одной статье на это не дают ответов, наверное они настолько очевидные...
Извиняюсь за свое тугодумство, но может кто то обьяснить как это все работает?
Заранее спасибо.

Спустя 4 часа, 55 минут, 13 секунд (27.08.2008 - 06:45) Viking написал(а):
ну все это как раз работает в ООП точно так же как и в других местах
а сами принципы ООП достаточно хорошо изложены во многих книгах да и статей в инете наверняка достаточно

Спустя 6 часов, 53 минуты, 45 секунд (27.08.2008 - 13:39) SiFaust написал(а):
Ура! Заработало! Спасибо большое всем) Моя ошибка была в том что я пытался заставить делать обьекты то что делают свойства. Уважаемый Viking мне об этом сказал но я не правильно сделал выводы и вместо того что бы исправить я просто начал создавать обьекты)

Вот как все получилось, надеюсь другим поможет мой горький опыт:
Код
<?
class Test
{
var $connect;
var $query;


function connect()
{
$this->connect = mysql_connect("localhost", "root", "");
mysql_select_db("Turney", $this->connect);
}
function query()
{
$this->connect();
$this->query=mysql_query("INSERT INTO TurneyLimitation (cap, lvl, nlvl) VALUES('123', '11', '23')");
return $this->query;
}
}
$add = new Test;
$add->query();
?>

Еще раз всем спасибо вы мне очень помогли.

Спустя 17 минут, 15 секунд (27.08.2008 - 13:56) zona7o написал(а):
предлагаю ввести изменения в код - такие:)

Код
<?
class Test
{
var $connect;
var $query;
var $base;

//конструктор
function Test($host,$base,$user,$pass)
{
$this->base=$base;
$this->connect=mysql_connect("$host", "$user", "$pass");
mysql_select_db("$this->base", $this->connect);
}

function query($cap,$lvl,$nlvl)
{
$this->query=mysql_query("INSERT INTO ".$this->base." (cap, lvl, nlvl) VALUES('$cap', '$lvl', 'nlvl')");
return $this->query;
}
}
$add = new Test('localhost','basename','root','');
$add->query($_POST['cap'],$_POST['lvl'],$_POST['nlvl']);
?>


по-моему нигде не ошибся)

Спустя 1 час, 13 минут, 17 секунд (27.08.2008 - 15:09) SiFaust написал(а):
Да, так и правда удобней ))

Правда одна ошибочка всетаки есть ))

строка:
Код
$this->query=mysql_query("INSERT INTO ".$this->base." (cap, lvl, nlvl) VALUES('$cap', '$lvl', 'nlvl')");


Там мы выбираем нужную нам таблицу, а вместо этого там стоит выбранная БД )

Спустя 10 минут, 24 секунды (27.08.2008 - 15:20) zona7o написал(а):
точно:) совсем загнался)
но думаю общий смысл ясен.

Спустя 18 дней, 17 часов, 24 минуты, 56 секунд (16.09.2008 - 08:45) Dezigo написал(а):


_____________
Всегда стремлюсь вперед, но почему то спотыкаюсь и падаю o.O
Быстрый ответ:

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