[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как объединить эти 2 метода в один?
m4a1fox
Имеем

private function generalImplodeArray($data){
$str = '';
ksort($data);
function FromArrayToStr($str){return '`'.$str.'` = :'.$str;}
return implode(', ', array_map("FromArrayToStr", array_keys($data)));
}

private function generalAndArray($data){
$str = '';
ksort($data);
function FromArrayToStrAND($str){return '`'.$str.'` = :'.$str;}
return implode(" AND ", array_map("FromArrayToStrAND", array_keys($data)));
}


Как их объединить. Вариант

private function generalImplodeArray($data, $delimeter = ','){
$str = '';
ksort($data);
function FromArrayToStr($str){return '`'.$str.'` = :'.$str;}
return implode(" $delimeter ", array_map("FromArrayToStr", array_keys($data)));
}

не подходит. Идеи у кого есть?



Спустя 17 минут, 58 секунд (14.08.2012 - 10:31) johniek_comp написал(а):
коментов бы добавил для приличия

Спустя 12 минут, 23 секунды (14.08.2012 - 10:43) Winston написал(а):
В каких случаях ты вызываешь generalAndArray и в каких generalImplodeArray ?
Можно ли по каким то признакам из $data определить, что нужно , или AND ?

Спустя 23 минуты, 44 секунды (14.08.2012 - 11:07) m4a1fox написал(а):
johniek_comp
Цитата
коментов бы добавил для приличия

Зачем? Вроде и так все понятно.
Winston
Цитата
Можно ли по каким то признакам из $data определить, что нужно , или AND

Из data не получится, это только массив.

Спустя 5 минут, 58 секунд (14.08.2012 - 11:13) Winston написал(а):
То есть тебе нужно передать в метод массив и чтобы скрипт сам решил, что подставлять , или AND?

Спустя 12 минут, 26 секунд (14.08.2012 - 11:25) m4a1fox написал(а):
Winston
Цитата
То есть тебе нужно передать в метод массив и чтобы скрипт сам решил, что подставлять , или AND?

В идеале да.

Спустя 6 минут, 52 секунды (14.08.2012 - 11:32) Winston написал(а):
Цитата (m4a1fox @ 14.08.2012 - 12:25)
В идеале да.

Хм.. biggrin.gif
А можешь показать содержимое $data для которого нужно использовать , и для которого нужно AND ?

Спустя 6 минут, 24 секунды (14.08.2012 - 11:39) m4a1fox написал(а):
Winston
Цитата
А можешь показать содержимое $data для которого нужно использовать , и для которого нужно AND ?

не вопрос. Сейчас залью.

Спустя 2 минуты, 52 секунды (14.08.2012 - 11:41) m4a1fox написал(а):
Имеем следующее. Есть такой класс.

<?php
class
Database extends PDO{
public function __construct($dbdriver, $hostname, $dbname, $username, $password, $char_set){
try{
parent::__construct($dbdriver . "::host=". $hostname ."; dbname=".$dbname, $username, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.$char_set));
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
exception_handler($e, 'Ошибка подключения к БД');
exit();
}
}


public function insert($table, $data){
$row = $this->generalImplodeArray($data);
$stn = $this->prepare("INSERT INTO `$table` SET $row ");
$stn->execute($data);
return $this->lastInsertId();
}

public function insertMulti($table, $data){
foreach($data as $value){
$this->insert($table, $value);
}
}


public function select($table, $data){
$where = $this->generalAndArray($data);
$sql = $this->prepare("SELECT * FROM `$table` WHERE $where");
$sql->execute($data);
return $sql->fetch(PDO::FETCH_OBJ);
}

public function selectMulti($table){
$sql = $this->query("SELECT * FROM `$table`");
return $sql->fetchAll(PDO::FETCH_CLASS, "stdClass");

}

public function update($table, $data, $where){
$str = $this->generalImplodeArray($data);
$stn = $this->prepare("UPDATE $table SET $str WHERE $where");
$stn->execute($data);
}

public function updateMulti($table, $data, $where){
foreach($data as $val){
$row = $this->generalImplodeArray($val);
$stn = $this->prepare("UPDATE $table SET $row WHERE `$where` = ".$val[$where]);
$stn->execute($val);
}
}


public function delete($table, $data){
$row = $this->generalImplodeArray($data);
$stn = $this->prepare("DELETE FROM $table WHERE $row");
$stn->execute($data);
}


public function cleanTable($table){
$stn = $this->prepare("TRUNCATE TABLE $table");
return $stn->execute();
}


private function generalImplodeArray($data){
$str = '';
ksort($data);
function FromArrayToStr($str){return '`'.$str.'` = :'.$str;}
return implode(', ', array_map("FromArrayToStr", array_keys($data)));
}

private function generalAndArray($data){
$str = '';
ksort($data);
function FromArrayToStrAND($str){return '`'.$str.'` = :'.$str;}
return implode(" AND ", array_map("FromArrayToStrAND", array_keys($data)));
}
}


Он общий.
Имеем такую модель
<?php 
class
get_db extends Model{

function __construct(){
parent::__construct();
}

function selectMulti($table){
return $this->db->selectMulti($table);
}

function insert1($data, $table='user'){
return $this->db->insert($table, $data);
}


function insert2($data, $table='user'){
return $this->db->insertMulti($table, $data);
}

function select($id, $table = 'user', $delimeter=','){
return $this->db->select($table, $id, $delimeter);
}

function updateTable($id, $data){
$this->db->update('user', $data, 'id='.$id);
}

function delete1($data, $table='user'){
$this->db->delete($table, $data);
}

}


ее методы используем в контроллерах

И собственно один из контроллеров

<?php
class
Log extends Controller{
public $data = array();


function __construct(){
parent::__construct();
$this->model('get_db');
}

function in(){
if(isset($_POST['send'])){
$this->login = $_POST['login'];
$this->pass = Hash::create('md5', $_POST['password'], HASH_KEY);
$tr = $this->get_db->select(array('name'=> $this->login, 'pass'=>$this->pass), 'admin', 'AND');

if(is_object($tr)){
Session::init();
Session::set('login', 'admin');
header('Location: /');
}else{
$t = 'Wrong';
}

$this->data['post'] = $t;
}else{
$this->data['post'] = NULL;
}
$this->view('log/index', $this->data);
}

function out(){
Session::destroy();
header("Location: /");
}
}


Если что, то я распишу подробнее.

Спустя 15 минут, 21 секунда (14.08.2012 - 11:57) Winston написал(а):
Честно говоря я не вижу признаков, по которым можно будет определить, что подставлять в implode у меня только один вариант
private function generalArray($data, $mode = 'sel'){
$implode = $mode == 'sel' ? ' AND ' : ', ';
$str = '';
ksort($data);
function FromArrayToStr($str){return '`'.$str.'` = :'.$str;}
return implode($implode, array_map("FromArrayToStr", array_keys($data)));
}


Спустя 5 минут, 44 секунды (14.08.2012 - 12:03) m4a1fox написал(а):
Winston
Собственно как и предполагал. Ну и на том спасибо.

Спустя 20 минут, 18 секунд (14.08.2012 - 12:23) killer8080 написал(а):
m4a1fox
хочешь сказать, это код у тебя работает? blink.gif

Спустя 28 минут, 5 секунд (14.08.2012 - 12:51) m4a1fox написал(а):
killer8080
smile.gif Что смущает?
Цитата
хочешь сказать, это код у тебя работает?
Да.

Спустя 7 минут, 2 секунды (14.08.2012 - 12:58) killer8080 написал(а):
Цитата (m4a1fox @ 14.08.2012 - 13:51)
killer8080
smile.gif Что смущает?
Цитата
хочешь сказать, это код у тебя работает?
Да.

Уверен? Попробуй дважды вызвать метод generalArray wink.gif

Спустя 42 секунды (14.08.2012 - 12:59) m4a1fox написал(а):
killer8080
Зачем это делать?

Спустя 2 минуты, 42 секунды (14.08.2012 - 13:01) Dezigo написал(а):
    private function generalImplodeArray($data, $delimeter = ','){
$str = '';
ksort($data);

return implode(" $delimeter ", array_map(function($str) {
return '`'.$str.'` = :'.$str;
}, array_keys($data)));
}

Спустя 34 секунды (14.08.2012 - 13:02) killer8080 написал(а):
Цитата (m4a1fox @ 14.08.2012 - 13:59)
killer8080
Зачем это делать?

Ну метод же не одноразовый smile.gif он может вызываться многократно. В твоем случае не больше двух раз rolleyes.gif

Спустя 3 минуты, 33 секунды (14.08.2012 - 13:05) m4a1fox написал(а):
Dezigo
Не понял вашего решения.
killer8080
Цитата
Ну метод же не одноразовый  он может вызываться многократно. В твоем случае не больше двух раз

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

Спустя 1 минута, 34 секунды (14.08.2012 - 13:07) killer8080 написал(а):
Цитата (m4a1fox @ 14.08.2012 - 14:05)
Метод делает то, что от него требуется. Принимает массив, и возвращает мне строку. Дело не в том, что я его дважды не смогу применить (как я понимаю в одном методе, Вы наверно имеете ввиду), тут дело в другом.

Второй вызов будет фатальным. Dezigo показал тебе правильное решение для php>=5.3, но я надеялся ты сам увидишь ошибку smile.gif

Спустя 9 минут, 45 секунд (14.08.2012 - 13:17) m4a1fox написал(а):
killer8080
Просто взять, и засунуть функцию в array_map()?
По вашему получается, что если так

private function generalImplodeArray($data){
$str = '';
ksort($data);
function FromArrayToStr($str){return '`'.$str.'` = :'.$str;}
return implode(', ', array_map("FromArrayToStr", array_keys($data)));
}

То ошибка, а если так

private function generalImplodeArray($data){
$str = '';
ksort($data);
return implode(', ', array_map(function($str){return '`'.$str.'` = :'.$str;}, array_keys($data)));
}

то нет?

Спустя 2 минуты, 37 секунд (14.08.2012 - 13:19) killer8080 написал(а):
Упрощенно твой код, пробуй, и смотри что будет
class A {
public function generalImplodeArray($data){
$str = '';
ksort($data);
function FromArrayToStr($str){return '`'.$str.'` = :'.$str;}
return implode(', ', array_map("FromArrayToStr", array_keys($data)));
}
}


$a = new A;
echo $a->generalImplodeArray(range(1, 10)).'<br />';
echo $a->generalImplodeArray(range(1, 10)).'<br />';

Спустя 2 минуты, 26 секунд (14.08.2012 - 13:22) m4a1fox написал(а):
killer8080
Сейчас гляну.

Спустя 1 минута, 43 секунды (14.08.2012 - 13:24) m4a1fox написал(а):
killer8080
Спасибо! Не знал. Даже не сталкивался.

Спустя 1 минута, 50 секунд (14.08.2012 - 13:25) killer8080 написал(а):
m4a1fox
если нужна совместимость с версиями ниже 5.3, используй create_function().

Спустя 48 секунд (14.08.2012 - 13:26) m4a1fox написал(а):
killer8080
Ясно.

Спустя 4 минуты, 39 секунд (14.08.2012 - 13:31) Dezigo написал(а):
Анонимные функции, я думал ты поймёшь ((
Это красиво + без внутриних дурацских функциий.
class A {
public function generalImplodeArray($data, $delimeter = ','){
$str = '';
ksort($data);

return implode(" $delimeter ", array_map(function($str) {
return '`'.$str.'` = :'.$str;
}, array_keys($data)));
}
}


$a = new A;
echo $a->generalImplodeArray(range(1, 10)).'<br />';
echo $a->generalImplodeArray(range(1, 100)).'<br />';

Спустя 1 минута, 3 секунды (14.08.2012 - 13:32) m4a1fox написал(а):
Dezigo
Цитата
Анонимные функции, я думал ты поймёшь ((

Да я как-то не сталкивался.... Но уже увидел разницу. Спасибо.

Спустя 3 минуты, 29 секунд (14.08.2012 - 13:35) killer8080 написал(а):
m4a1fox
просто запомни, что в php все функции глобальны. Нельзя функцию объявлять дважды, соответственно нельзя декларацию помещать в функцию, или метод.

Спустя 3 минуты, 19 секунд (14.08.2012 - 13:39) m4a1fox написал(а):
killer8080
Цитата
просто запомни, что в php все функции глобальны. Нельзя функцию объявлять дважды, соответственно нельзя декларацию помещать в функцию, или метод.

Уже. Спасибо.

Спустя 1 минута, 26 секунд (14.08.2012 - 13:40) killer8080 написал(а):
Цитата (killer8080 @ 14.08.2012 - 14:35)
просто запомни, что в php все функции глобальны.

Если конечно, не используешь namespaces smile.gif
Быстрый ответ:

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