|
|
|
| Дабрый день помогите неучу Изучаю PHP на примерах Куперина Романа. Есть проблема со скриптом ввода рубрики в базу данных. В общем всё работает нармально. только при отработке скрипта добавления рубрики в базу данных зти рубрики не вносятся. PHP ни каких ошибок не выдает. Причем скрипт вывода списка существующих рубрик отрабатывает нормально. Тоесть связь с базой нармальная и операции с внутренними переменными базы проходят нормально. Подскажите пожалуста где искать собаку а то я скоро начну курочить аппаратную часть.:) | |
|
|
|
|
|
|
|
для: Тимофей77
(24.02.2009 в 19:53)
| | Не, аппаратную часть пока не трогай. Дай-ка сначала на код взглянуть, на тот что добавляет рубрики в базу. Если не разберемся в нем, то тогда уж можно будет и в аппаратную часть лезть. | |
|
|
|
|
|
|
|
для: Тимофей77
(24.02.2009 в 19:53)
| | чаще мои ошибки с добавлением в базу данных, это раставление скобок или несовпадение количества полей.
Тестирую так вывожу полностью запрос копирую вставляю в phpmyadmin а он мне уже отвечает на все)) | |
|
|
|
|
|
|
|
для: Dimka31
(24.02.2009 в 20:23)
| | Извиняюсь
Выкладываю тело скриптов отвечающие за формирование запросов на проверку существования и добавление рубрики
var $in_cat_name;
function in_cat_add_check()
{
// добавление слешей перед управляющими символами .
$this->in_cat_name=AddSlashes($this->in_cat_name);
// проверка на кол-во символов
if(strlen($this->in_cat_name)==0) return(21);
if(strlen($this->in_cat_name)>50) return(22);
// проверяем на существование такой рубрики
$this->sql_res="select c_id from tbl_cats where c_name='".$this->in_cat_name."'";
$this->sql_execute();
if($this->sql_err) return(11);
if(mysql_num_rows($this->sql_res)) return(23);
return(0);
}
function in_cat_add()
{
// Проверяем данные на корректность
$err=$this->in_cat_add_check();
if($err) return($err);
// Формируем запрос в БД
$this->sql_query="insert into tbl_cats (c_name) values('".$this->in_cat_name."')";
/$this->sql_execute();
//
if($this->sql_err) return(11);
return(0);
Общая информация
Скрипты разбиваются на классы переменная in_cat_name вводится в форме как $name и присваивается in_cat_name в теле исполнительного скрипта перед исполнением in_cat_add()
Дополнительно даю тело скриптов отвечающих за связь с базой и отправки запроса
var $sql_login="root";
var $sql_passwd="123";
var $sql_database="roma";
var $sql_host="localhost";
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);
$this->conn_log_id=mysql_connect($this->sql_host,$this->sql_login,$this->sql_passwd);
mysql_select_db($this->sql_database);
mysql_query("set character_set_client='cp1251'");
mysql_query("set character_set_results='cp1251'");
}
function sql_close()
{
mysql_close($this->conn_id);
}
function sql_execute()
{
$this->sql_res=mysql_query($this->sql_query,$this->conn_id);
$this->sql_err=mysql_error();
}
Проверял вводить в ручную данные запросы нормально вводятся а из скриптов не в какую
Заранее блогодарен | |
|
|
|
|
|
|
|
для: Тимофей77
(24.02.2009 в 21:28)
| | Как-то запутано ты все это дело запостил. Если не сложно, отредактируй: используй тэги "code" для выделения своего кода, перед кодом поставь "<?php" тэг для его подсветки. Так, все быстрее разберутся в твоем коде и помогут. | |
|
|
|
|
|
|
|
для: newProgrammer
(24.02.2009 в 21:57)
| | code
<?php
var $in_cat_name;
function in_cat_add_check()
{
// добавление слешей перед управляющими символами .
$this->in_cat_name=AddSlashes($this->in_cat_name);
// проверка на кол-во символов
if(strlen($this->in_cat_name)==0) return(21);
if(strlen($this->in_cat_name)>50) return(22);
// проверяем на существование такой рубрики
$this->sql_res="select c_id from tbl_cats where c_name='".$this->in_cat_name."'";
b //первое проблемное место смотреть в верх : ) /b
$this->sql_execute();
if($this->sql_err) return(11);
if(mysql_num_rows($this->sql_res)) return(23);
return(0);
}
function in_cat_add()
{
// Проверяем данные на корректность
$err=$this->in_cat_add_check();
if($err) return($err);
// Формируем запрос в БД
$this->sql_query="insert into tbl_cats (c_name) values('".$this->in_cat_name."')";
b// второе проблемное место /b
/$this->sql_execute();
//
if($this->sql_err) return(11);
return(0);
?>
/code
Да вот пришло в голову следующие причины
1 Несовпадает кодировка
2 неработают некоторые возможности апача на виндовс платформе
3 проблемы с настройками таблиц в мускуле
Если не трудно можете подсказать талковые пути проверки данных вариантов. | |
|
|
|
|
|
|
|
для: Тимофей77
(24.02.2009 в 22:37)
| | Не те тэги написал :) Есть специальные тэги при написании сообщения [ code ][ / code ] (только без пробелов).
По теме: явно проблема в коде. Например, вот это:
<?php
$this->sql_query="insert into tbl_cats (c_name) values('".$this->in_cat_name."')";
$this->sql_execute();
?>
|
Я так понимаю, что метод sql_execute() и есть тот метод, который, в данном случае, добавляет рубрику в базу. Но почему "$this->" стоит перед этим методом? "$this->" означает, что метод относится именно к тому классу, из которого вызывается. Но судя по коду, этот метод определен в другом классе. Это во-первых. А во-вторых, логично будет предположить, что строка запроса должна быть передана в метод в качестве параметра.
Примерно это будет выглядеть так:
<?php
//составляем строку запроса
$this->sql_query = "insert into tbl_cats ($c_name) values('".$this->in_cat_name."')";
//создаем объект класса, определения которого нет в коде, а должно было быть
$con = new ClassName; //примерное наимнование класса
$con->sql_execute($this->sql_query);
?>
|
И таких ляпов в коде много. Короче говоря, проще для тебя писать не классами, а обычными функциями. | |
|
|
|
|
|
|
|
для: newProgrammer
(24.02.2009 в 23:40)
| | Вы полностью правы. Мой промах. Я забыл указать что все классы наследуются друг от друга тоесть in класс ( класс формирования запроса) наследует возможности класса msql (класс отправки запроса) тоесть на сколько я понимаю что в принципе их можно считать одним классом ( от общего к деталям) в принципе мня это и заинтересовало.
Ранее я обмолвился о функции выборки данных из базы
var $out_cat_list;
function out_cat_list()
{
$this->sql_query="select c_id, c_name from tbl_cats order by c_name";
$this->sql_execute();
if($this->sql_err) return(11);
while(list($id, $name)=mysql_fetch_row($this->sql_res))
{
$this->out_cat_list.="<a href=/cat/?cat=$id>$name</a><br>\n";
}
return(0);
}
var $out_cat_list;
function out_cat_list()
{
$this->sql_query="select c_id, c_name from tbl_cats order by c_name";
$this->sql_execute();
if($this->sql_err) return(11);
while(list($id, $name)=mysql_fetch_row($this->sql_res))
{
$this->out_cat_list.="<a href=/cat/?cat=$id>$name</a><br>\n";
}
return(0);
}
|
которая при этой конструкции работает без отдельного определения класса в котором находится метод $this->sql_execute();
А ошибка действительно в коде прописал в чистых функциях всё работает. но всё таки хочется разжевать классы. Не подскажете где более доходчиво они описаны.
За ранее блогодарен. | |
|
|
|
|
|
|
|
для: Тимофей77
(25.02.2009 в 02:46)
| | Дейтсвительно, очень сложно что-либо говорить когда не видишь, где начинаются и где кончаются классы, какой из них наследует какой, к какому именно классу прнадлежит тот или иной метод. В таком случае ничего однозначного сказать не получится.
Сам недавно начал учить ООП. В интернете есть статьи, но среди них мало таких, которые бы походили на случаи из реальной жизни. Поэтому нельзя забывать и про книги.
Из статей советую эти:
-на русском
http://www.softtime.ru/info/articlephp.php?id_article=108
http://php.su/learnphp/phpoo/?php5
http://www.phpworld.ru/php5/index.php
-на английском
http://serialize.us/?p=44
Из книг, скачал недавно книгу на английском в рунете, ничего так, много полезного прочитал, называется Object-Oriented Programming with PHP5 (Hasin Hayder). Правда, не помню откуда скачал. Попробуй поискать по названию... | |
|
|
|