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, всё строится на объектах, каждая таблица в БД - это объект, каждое поле - это св-ва объекта
Не вариант... щас тебе растолкуют прогеры, которые любят поболтать:))
Если хочешь полного контроля (почти) посмотри в сторону xPDO, всё строится на объектах, каждая таблица в БД - это объект, каждое поле - это св-ва объекта

Спустя 7 минут, 48 секунд (12.09.2011 - 10:02) killer8080 написал(а):
m4a1fox
а зачем два раза public function?
а зачем два раза 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 конкатенация
Опечатка, это в JS конкатенация

Спустя 2 минуты, 33 секунды (12.09.2011 - 10:08) m4a1fox написал(а):
sharki
Цитата |
это в JS конкатенация |
Да в JS встречал. По сути эхто эквивалентно записи?
Спустя 9 минут, 47 секунд (12.09.2011 - 10:18) sharki написал(а):
m4a1fox
В JS "+=" == ".=" в PHP
А так насчет твоего WHERE и инъекций
В 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
Ну всё возможно, немного фантазии, и будет тебе конструктор запросов
Ну всё возможно, немного фантазии, и будет тебе конструктор запросов

Спустя 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
Слишком узко, сам же видишь
Ты подумай как лучше, сделай так, чтобы можно было дать ему пару массивов, или один, и он бы просто распарсил и всё, а в массиве указывается какой метод, или оператор использовать...
Слишком узко, сам же видишь

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