[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: правильная выборка из БД через класс
m4a1fox
Всем доброго утра. Итересует такая ситуация. Кто и как делает выборку, обновление, удаление и вставка данных из БД. Дабы узнать общий принцип. Так как. Можно делать все это по разному, интересно как правильно. Вот есть такая выборка

public function public function updateLink($post){
if($this->__construct($post) != false){
$sql = "UPDATE `".$this->getLink()."` SET
`title` = '"
.$this->clean_text($post['title'])."',
`meta_k` = '"
.$this->clean_text($post['meta_k'])."',
`meta_d` = '"
.$this->clean_text($post['meta_d'])."',
`text` = '"
.$this->clean_text($post['text'])."',
`date` = '"
.$post['date']."',
`time` = '"
.$post['time']."',
`link` = '"
.$post['link']."'
WHERE `link` = '"
.$_GET['link']."'
"
;
//echo $sql;
connectDb::sql($sql);
header("Location: ".$this->getLink()."&act=ok");
}else{
echo $this->error;
}
}


И применяем его (естественно заранее объявив)

echo $add->updateLink($_POST);


Но можно и по другому сделать

public function public function updateLink($from, $post, $where){
if($this->__construct($post) != false){
$sql = "UPDATE `".$from."` SET
`title` = '"
.$this->clean_text($post['title'])."',
`meta_k` = '"
.$this->clean_text($post['meta_k'])."',
`meta_d` = '"
.$this->clean_text($post['meta_d'])."',
`text` = '"
.$this->clean_text($post['text'])."',
`date` = '"
.$post['date']."',
`time` = '"
.$post['time']."',
`link` = '"
.$post['link']."'
'"
.$where."'
"
;
//echo $sql;
connectDb::sql($sql);
header("Location: ".$this->getLink()."&act=ok");
}else{
echo $this->error;
}
}


И применяем

echo $add->updateLink("test", $_POST, "WHERE `id`=".$_GET['id'].");


Собственно, М. Кузнецов и И. Симдянов именно так (насколько я понял) и делают. А как вы решаете эти вопросы?



Спустя 11 минут, 49 секунд (12.09.2011 - 09:54) sharki написал(а):
m4a1fox
Не вариант... щас тебе растолкуют прогеры, которые любят поболтать:))

Если хочешь полного контроля (почти) посмотри в сторону xPDO, всё строится на объектах, каждая таблица в БД - это объект, каждое поле - это св-ва объекта smile.gif

Спустя 7 минут, 48 секунд (12.09.2011 - 10:02) killer8080 написал(а):
m4a1fox
а зачем два раза public function?
Цитата (m4a1fox @ 12.09.2011 - 09:42)
public function public function updateLink($from, $post, $where){


Спустя 1 минута, 4 секунды (12.09.2011 - 10:03) sharki написал(а):
m4a1fox
Если хочешь сам написать класс для работы с БД то я бы сделал так, и по аналогии другие методы
$post = array(
'title' => 'sdfsdf',
'meta_k'=> '3423424'
# и т.д
);
function updateLink($from, $post, $where){
if($this->__construct($post) != false){
$sql = "UPDATE `".$from."` SET ";
$sqlF = "";
foreach ($post as $key => $value) {
$sqlF .= ",`".$key."` = '".$this->clean_text($value)."'";
}
$sqlF = mb_substr($sqlF, 1);
$sql .= $sqlF.$where;
//echo $sql;
connectDb::sql($sql);
header("Location: ".$this->getLink()."&act=ok");
}else{
echo $this->error;
}
}

Спустя 1 минута, 42 секунды (12.09.2011 - 10:04) m4a1fox написал(а):
killer8080
Цитата
а зачем два раза public function?

Очепятка!

sharki
Цитата
$sql += $sqlF.$where;

кстати, что значи "+="

И еще! А как быть с возможной sql инъекцией в $where? Там же можно подставить что угодно!

Спустя 1 минута, 33 секунды (12.09.2011 - 10:06) sharki написал(а):
m4a1fox
Опечатка, это в JS конкатенация biggrin.gif

Спустя 2 минуты, 33 секунды (12.09.2011 - 10:08) m4a1fox написал(а):
sharki
Цитата
это в JS конкатенация

Да в JS встречал. По сути эхто эквивалентно записи?

Спустя 9 минут, 47 секунд (12.09.2011 - 10:18) sharki написал(а):
m4a1fox
В JS "+=" == ".=" в PHP

А так насчет твоего WHERE и инъекций

$post = array(
'title' => 'sdfsdf',
'meta_k'=> '3423424'
# и т.д
);

$where = array(
'id' => array(
'op' => '=',
'val' => '4'
),
'field' => array(
'op' => '!=',
'val' => 'bla'
),
);


/* или
$where = array(
'id' => array(
'op' => '=',
'val' => '4'
)
);
*/



function updateLink($from, $post, $where){
if($this->__construct($post) != false){
$sql = "UPDATE `".$from."` SET ";
$sqlF = "";
foreach ($post as $key => $value) {
$sqlF .= ",`".$key."` = '".$this->clean_text($value)."'";
}
$sqlF = mb_substr($sqlF, 1);

$sqlW = "";
if(count($where)>1){
$i = 1;
foreach ($where as $key => $value) {
if($i===1)
$sqlW .= " WHERE `".$key."` ".$value['op'].( is_int($value['val']) ? (int)$value['val'] : mysql_real_escape_string ($value['val']) );
else
$sqlW .= " AND `".$key."` ".$value['op'].( is_int($value['val']) ? (int)$value['val'] : mysql_real_escape_string ($value['val']) );
$i++;
}
}
else
$sqlW .= " WHERE `".$key."` ".$value['op'].( is_int($value['val']) ? (int)$value['val'] : mysql_real_escape_string ($value['val']) );

$sql .= $sqlF.$sqlW;

//echo $sql;
connectDb::sql($sql);
header("Location: ".$this->getLink()."&act=ok");
}else{
echo $this->error;
}
}


Спустя 4 минуты, 15 секунд (12.09.2011 - 10:22) m4a1fox написал(а):
sharki
Да! Понятно! Спасибо!
Значит в первом посте темы второй вариант выборки более приемлен!?

Спустя 47 минут, 2 секунды (12.09.2011 - 11:10) m4a1fox написал(а):
То есть по сути можно написать один метод в классе для работы со всеми таблицами в БД?

Спустя 1 час, 50 минут, 36 секунд (12.09.2011 - 13:00) sharki написал(а):
m4a1fox
Ну всё возможно, немного фантазии, и будет тебе конструктор запросов smile.gif

Спустя 9 минут, 41 секунда (12.09.2011 - 13:10) m4a1fox написал(а):
Ага! То есть так

public function someBlog($do, $from, $post="", $t="", $action, $where="", $limit){
if($this->__construct($post) != false){
$sql = "".$do." `".$from."` SET ";
$sqlF = "";
foreach ($post as $key => $value) {
if($key != $action){
$sqlF .= " `".$key."` = '".$this->clean_text($value)."', ";
}
}

$sqlF .= $t;
$sqlF = mb_substr($sqlF, 1);

$sqlW = " ".$where;
$sqlL = " ".$limit;
$sql .= $sqlF.$sqlW.$sqlL;

//echo $sql;
connectDb::sql($sql);
header("Location: ".$this->getLink()."&act=ok");
}else{
echo $this->error;
}
}


и так

$add->someBlog("UPDATE ", "blog", $_POST, "`img` = '".$img."'", "edit", "`id` = '".$_GET['id']."'", "");


Можно?

Спустя 6 минут, 53 секунды (12.09.2011 - 13:17) sharki написал(а):
m4a1fox
Слишком узко, сам же видишь smile.gif Ты подумай как лучше, сделай так, чтобы можно было дать ему пару массивов, или один, и он бы просто распарсил и всё, а в массиве указывается какой метод, или оператор использовать...

Спустя 5 минут, 37 секунд (12.09.2011 - 13:22) m4a1fox написал(а):
sharki
Да, узко получается. С этим согласен. Только как передать массив с id. Вот к примеру, оказывается, просто я не знал - post не видит поля type="file". Приходится его подключать если такой существует, а так же, я отдалился от первоначально цели - исключить возможность подтосовки $_GET['id']...

Спустя 5 минут, 44 секунды (12.09.2011 - 13:28) sharki написал(а):
m4a1fox
Ты же все равно ручками пишешь какие поля тебе надо обновить, зачем в функцию передавать на парсинг $_POST[''], ведь тебе надо создать новый массив С НУЖНЫМИ ТОЛЬКО тебе данными и отправить в функцию для обработки данных, чтобы не было подтасовки придумывай хеш ключи и т.п Все надо делать проще, в этом и есть изюминка smile.gif
Быстрый ответ:

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