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 ?
Можно ли по каким то признакам из $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) |
В идеале да. |
Хм..
А можешь показать содержимое $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
хочешь сказать, это код у тебя работает?
хочешь сказать, это код у тебя работает?
Спустя 28 минут, 5 секунд (14.08.2012 - 12:51) m4a1fox написал(а):
killer8080
Что смущает?
Что смущает?
Цитата |
хочешь сказать, это код у тебя работает? |
Да.
Спустя 7 минут, 2 секунды (14.08.2012 - 12:58) killer8080 написал(а):
Цитата (m4a1fox @ 14.08.2012 - 13:51) | ||
killer8080 Что смущает?
Да. |
Уверен? Попробуй дважды вызвать метод generalArray
Спустя 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 Зачем это делать? |
Ну метод же не одноразовый он может вызываться многократно. В твоем случае не больше двух раз
Спустя 3 минуты, 33 секунды (14.08.2012 - 13:05) m4a1fox написал(а):
Dezigo
Не понял вашего решения.
killer8080
Не понял вашего решения.
killer8080
Цитата |
Ну метод же не одноразовый он может вызываться многократно. В твоем случае не больше двух раз |
Метод делает то, что от него требуется. Принимает массив, и возвращает мне строку. Дело не в том, что я его дважды не смогу применить (как я понимаю в одном методе, Вы наверно имеете ввиду), тут дело в другом.
Спустя 1 минута, 34 секунды (14.08.2012 - 13:07) killer8080 написал(а):
Цитата (m4a1fox @ 14.08.2012 - 14:05) |
Метод делает то, что от него требуется. Принимает массив, и возвращает мне строку. Дело не в том, что я его дважды не смогу применить (как я понимаю в одном методе, Вы наверно имеете ввиду), тут дело в другом. |
Второй вызов будет фатальным. Dezigo показал тебе правильное решение для php>=5.3, но я надеялся ты сам увидишь ошибку
Спустя 9 минут, 45 секунд (14.08.2012 - 13:17) m4a1fox написал(а):
killer8080
Просто взять, и засунуть функцию в array_map()?
По вашему получается, что если так
То ошибка, а если так
то нет?
Просто взять, и засунуть функцию в 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().
если нужна совместимость с версиями ниже 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 все функции глобальны. Нельзя функцию объявлять дважды, соответственно нельзя декларацию помещать в функцию, или метод.
просто запомни, что в 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