Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2011, 16:17   #1
Abuhamed
Форумчанин
 
Аватар для Abuhamed
 
Регистрация: 27.01.2010
Сообщений: 330
По умолчанию DAO php class

PHP код:
<?php
class db{

    function 
mysql_qw()
    {
        
$args func_get_args();
        
$query $this->mysql_make_qw($args);
        
print_r($query);
        
//print_r($query);
        //mysql_query($query) or die("mysql eror, please write to administrator");
    
}
    function 
mysql_make_qw()
    {
        
$args func_get_args();
        
$tmpl =& $args[0];
        
$tmpl str_replace("%""%%"$tmpl);
        
$tmpl str_replace("?""%s"$tmpl);
        foreach (
$args as $i=>$v){
            if(
$i!=0){
                
$args[$i] = "'".mysql_escape_string($v)."'";
            }
        }
        return 
call_user_func_array("sprintf"$args);
    }
}
$db = new db();
?>
Вот файл server.php
PHP код:
<?php
include_once("db.class.php");
$id "1";
$votes "2";
$db->config();
$db->connect();
$db->mysql_qw("SELECT * FROM brands WHERE id=? AND vote1=?"$id$votes);
?>
Вообщем выводит array! Но должно же выводить строку
PHP код:
SELECT FROM brands WHERE id='1' AND vote1='2'
В чем проблем, подскажите
Abuhamed вне форума Ответить с цитированием
Старый 30.10.2011, 17:22   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Abuhamed Посмотреть сообщение
В чем проблем, подскажите
Поиск ошибок и отладка

error_reporting(E_ALL); - помогает искать проблемы в коде.

call_user_func_array() - тут используется непонятно как(см. Notice при её использовании), и совсем здесь не нужна.

sprintf() - нативная функция PHP, незачем её вызывать через всякие костыли.
Andkorol вне форума Ответить с цитированием
Старый 30.10.2011, 21:51   #3
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Я что-то не понял ... смотрю на вопросики в запросе .. думаю там у вас prepared statements .. ан нет .. дальше зачем-то изобретаете какой-то велосипед и все это зачем-то парсите. Совет : забудьте о драйвере mysql и возьмите mysqli или PDO, там за вас все это уже сделано в нативной форме
Cronos20 вне форума Ответить с цитированием
Старый 31.10.2011, 07:31   #4
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

PHP код:
<?php
//v 0.2 mysubd_sqli framework
//mysqli database interface
// массивы ассоциативны
// utf8 document

class mysql extends mysqli {
static private 
$_instance null;
protected function 
__construct(){}
static public 
$quote "'"// обёртка в кавычки включена по умолчанию (функции es ev)
static public function start(){
    if (
self::$_instance == null) {
        
self::$_instance = new mysql();
        @
self::$_instance->connect(
            
'localhost'//хост
            
'root',        // пользователь
            
''// пароль
            
'secur'); // имя базы данных
        
mysqli_connect_errno() and die ('<b>Ошибка базы данных MYSQL</b><hr>'.mysqli_connect_error()); // ошибки
        
self::$_instance->set_charset('utf8'); // кодировка
    
}
    return 
self::$_instance;
}
// методы класса

// однострочный массив
// для запросов класса SELECT возвращает первую строку таблицы
static function read($query) { #line 
    
return mysqli_fetch_assoc(self::$_instance->query($query)); //ассоциативный
}
// многострочный, двумерный массив
// для запросов класса SELECT возвращает весь результат запроса
static function read_all($query){ #table
    
$res self::$_instance->query($query);
    while (
$row=mysqli_fetch_assoc($res)) { $ret[]=$row; } //ассоциативный
    
if (isset($ret)) { return $ret; }
    return 
false;
}
// без массива
// возвращает значение первой ячейки таблицы
static function read_one($query) { #one
    
if ($ret=mysqli_fetch_row(self::$_instance->query($query))) { //отсутввует
        
return $ret[0]; 
    }
    return 
false;
}
// экранирование строковых переменных
static function es($str) { // escape string
    
return self::$quote.self::$_instance->escape_string($str).self::$quote;
}
// экранирование нескольких переменных сразу
static function ev() { // ev(&$name, &$email) пример вызова
    
$trace debug_backtrace();
    
$args $trace[0]['args'];
    foreach (
$args as &$a) {
        
$a self::$quote.self::$_instance->escape_string($a).self::$quote;
    }
}
// вставка новго значения в таблицу
//$table_Columns - строка названия таблицы и колонок
// table ( col1 , col2 )
// $values - одномерный массив с числовыми индексами со значениями которые будут вставлены
# размер массива кратен числу стоблцов
// mysql::insert('table ( col1 , col2 )',array('c1','c2','b1','b2','d1',"d'f'f'f2"));
static function insert($table_Columns,$values) { 
preg_match('/(.*)\((.+)\).*/',$table_Columns,$cols);
$table_Columns '`'.trim($cols[1]).'`(`'.implode('`,`',explode(',',str_replace(' ','',$cols[2]))).'`)';
$kol substr_count($table_Columns,',')+1;
$skolcount($values)/$kol;
$qu '';
for (
$i=0$i<$skol$i++) {
    
$qu .= "(";
    for (
$ii=0$ii<$kol$ii++) {
        
$qu .= self::es($values[$i*$kol+$ii]).",";
    }
    
$qu{strlen($qu)-1} = ')';
    
$qu .= ',';
}
$qu{strlen($qu)-1} = ';';
return 
self::$_instance->query('INSERT INTO '.$table_Columns.' VALUES '.$qu);
}
// обновление занчения строки в базе данных
//$table_Columns - строка названия таблицы и колонок
// table ( col1 , col2 )
// $values - одномерный массив с числовыми индексами со значениями которые будут обновлены
//$filter - условие
# размер массива кратен числу стоблцов
# update('table ( col1 , col2 )', array('c1','c2'),  'id = 12')

static function update($table_Columns$values,  $filter) {
preg_match('/(.*)\((.+)\).*/',$table_Columns,$cols);
$col explode(',',str_replace(' ','',$cols[2]));
$qu '';
for(
$i=0$i<count($values); $i++) {
    
$qu .= '`'.$col[$i]."` = ".self::es($values[$i]).",";
}
$qu{strlen($qu)-1} = ' ';
return 
self::$_instance->query('UPDATE `'.trim($cols[1]).'` SET '.$qu.'WHERE '.$filter);
}

# end class

/*print '<pre>';
$m = mysql::start();
#$m->insert('test(data,data2)',array("d1",'d2'));
#$m->update('test(data2)',array('upd_text2'),'id = 2');
if ($res=$m->read_all('select data from test where id=10')) {
    var_dump($res);
} else { print 'false'; }*/

Последний раз редактировалось Lesha; 31.10.2011 в 07:38.
Lesha вне форума Ответить с цитированием
Старый 31.10.2011, 11:46   #5
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Lesha, извините, но это крайне неудачная реализация велосипеда ))) с кучей логических ошибок )
Посмотрите как такое выглядит ... ну допустим в Zend , хотя это наверное и на самый лучший пример

Последний раз редактировалось Cronos20; 31.10.2011 в 11:50.
Cronos20 вне форума Ответить с цитированием
Старый 31.10.2011, 22:23   #6
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
ну допустим в Zend
http://framework.zend.com/manual/ru/...b.adapter.html

Это типа как тут?

ну давай сравним

ZEND
PHP код:
$config = new Zend_Config(
    array(
        
'database' => array(
            
'adapter' => 'Mysqli',
            
'params' => array(
                
'dbname' => 'test',
                
'username' => 'webuser',
                
'password' => 'secret',
            )
        )
    )
);
 
$db Zend_Db::factory($config->database); 
MYSUBD
PHP код:
@self::$_instance->connect(
            
'localhost'//хост
            
'root',        // пользователь
            
''// пароль
            
'secur'); // имя базы данных
        
mysqli_connect_errno() and die ('<b>Ошибка базы данных MYSQL</b><hr>'.mysqli_connect_error()); // ошибки
        
self::$_instance->set_charset('utf8'); // кодировка 
ZEND
PHP код:
$sql 'SELECT * FROM bugs WHERE bug_id = ?';
 
$result $db->fetchAll($sql2); 
MYSUBD
PHP код:
$id 2;
mysql::ev(&$id);
$result mysql::read_all("SELECT * FROM bugs WHERE bug_id = $id"); 
ZEND
PHP код:
$result $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2'); 
MYSUBD
PHP код:
$result mysql::read('SELECT * FROM bugs WHERE bug_id = 2'); 
ZEND
PHP код:
$result $db->fetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2');
// это единственное строковое значение
echo $result
MYSUBD
PHP код:
$result mysql::read_one('SELECT bug_status FROM bugs WHERE bug_id = 2'); 
ZEND
PHP код:
$data = array(
    
'created_on'      => '2007-03-22',
    
'bug_description' => 'Something wrong',
    
'bug_status'      => 'NEW'
);
 
$db->insert('bugs'$data); 
MYSUBD
PHP код:
mysql::insert('bugs ( created_on, bug_description, bug_status )',array(
    
'2007-03-22',
    
'Something wrong',
    
'NEW',
    
'2008-07-10',
    
'Something right',
    
'OLD' // 2 строки сразу
)); 
ZEND
PHP код:
$data = array(
    
'updated_on'      => '2007-03-23',
    
'bug_status'      => 'FIXED'
);
$n $db->update('bugs'$data'bug_id = 2'); 
MYSUBD
PHP код:
mysql::update('bugs ( updated_on, bug_status )'
    array( 
'2007-03-23''FIXED'), 'bug_id = 2'); 
ZEND
PHP код:
$n $db->delete('bugs''bug_id = 3'); 
MYSUBD
PHP код:
надо добавить 
ZEND
PHP код:
$name $db->quote("O'Reilly");
echo 
$name;
// 'O\'Reilly'
 
$sql "SELECT * FROM bugs WHERE reported_by = $name";
 
echo 
$sql;
// SELECT * FROM bugs WHERE reported_by = 'O\'Reilly' 
MYSUBD
PHP код:
$name mysql::es("O'Reilly");
$sql "SELECT * FROM bugs WHERE reported_by = $name";
echo 
$sql
ZEND
PHP код:
$value '1234';
$sql 'SELECT * FROM atable WHERE intColumn = '
     
$db->quote($value'INTEGER'); 
MYSUBD
PHP код:
надо добавить 
ZEND
PHP код:
Управление транзакциями 
MYSUBD
PHP код:
не поддерживается 
да некоторые вещи надо допилить, но сам факт в том что MYSUBD это монолитный модуль не требующий ничего кроме себя самого, в отличие от ZEND где он является частью Огромного фрейм ворка.
Lesha вне форума Ответить с цитированием
Старый 31.10.2011, 22:43   #7
Cronos20
Форумчанин
 
Регистрация: 08.07.2010
Сообщений: 679
По умолчанию

Зря вы начали сравнивать с зендом, я ж говорил про логические ошибки .. попросили бы, я что-нить перечислил)))
Ну красивый вызов Singleton типа ::getInstance() бог с ним, но зачем вы везде создаете статические методы класса??? А потом вызываете их
$m->insert или $m->update ? Одно дело это некорректно с точки зрения кода, но к тому же эти статические методы не позволят например вам создать второе соединение с другой базой.
Зачем вы гоняете в read_all полученный данные циклом, чтобы получить снова то же самое?) + правильнее с точки типизации возвращать один тип данных из функции ..
Код:
static function read_all($query){
    $res = self::$_instance->query($query);
    return (empty($res)) ? array() : $res; // получается затем с данными вы сможете работать сразу с помощью foreach например без лишней проверки + убрали лишний цикл;
}
У вас та же проблема что и у ТС ... зачем вы передаете строкой названия полей (а потом еще и парсите их) и отдельно массив значений??? Не проще и красивее передавать это все ассоциативным массивом поле=>значение ?? Я не говорю о том, что хорошо бы пользоваться все теми же prepared stetements ... Ну об остальном наверное не буду, там чистый холивар получится ....
P.S. И к черту этот зенд .. я ж говорю это не лучший пример))

Последний раз редактировалось Cronos20; 31.10.2011 в 22:55.
Cronos20 вне форума Ответить с цитированием
Старый 31.10.2011, 23:05   #8
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
зачем вы везде создаете статические методы класса
чтобы без объявления переменных мгновенно дать команду для базы данных одной строкой

PHP код:
if ($res=mysql::start()->read_one("SELECT id FROM user WHERE login = $login AND passw = $passw") {
// вход выполнен
} else {
// не выполнен

Цитата:
Одно дело это некорректно с точки зрения кода, но к тому же эти статические методы
ну то что тут сам по себе синглтон корявенький немного, можно было вообще без него сделать, это да.

Цитата:
не позволят например вам создать второе соединение с другой базой.
на мульти соединенние какбы изначально не ориентировался, просто трудно представить что один сайт будет использовать 2-3 базы данных.

Цитата:
зачем вы передаете строкой названия полей (а потом еще и парсите их)
1) видно с какими полями идет работа
2) парсинг для автозаковычивания полей для предовращения вызова зарезервированных полей, однако изначально это не делалось, думал что будут хардкордным методом сам кавычки прописывать, но потом лень победила и решил что пусть само в качки клепает.

Цитата:
отдельно массив значений???
а где его передавать? только отдельно, + значения переданные в массив автоэекранируются mysqli_real_escape , что избавляет от головной боли по поводу кавычек опять же.

Цитата:
расивее передавать это все ассоциативным массивом поле=>значение
ну это дело привычки, + числовой массив позволяет мульти вставку строк, банальным перечислением элементов до нужной длины.
Цитата:
что хорошо бы пользоваться все теми же prepared
хотел, хотел, но там замуты еще те получаются, не лучше чем здешний "парсинг ковычек"
Lesha вне форума Ответить с цитированием
Старый 31.10.2011, 23:19   #9
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
Зачем вы гоняете в read_all полученный данные циклом, чтобы получить снова то же самое?
такой хоривар уже был. в стиле

PHP код:
$res mysql_query($query);
while(
$row mysql_fetch_assoc($res)) {
echo 
$row['id'];

VS

PHP код:
$row mysql_read($query);

foreach (
$row as $col) {
echo 
$col;

c точки зрения потери производительности то цифра уже есть , и она опеределена многими тестами это 30% в самом безнадежном случае.

ТО есть незначительно и это только на получение данных в остальном все тоже самое.

А удобство хранения, многократного использования, преобразования массива из базы очевидны

Цитата:
правильнее с точки типизации возвращать один тип данных из функции ..
уже была задумка, в виде формального параметра, которые опеделял бы тип выдаваемых данных в случае пустого результата

PHP код:
//mysql_read Function v0.3
function mysqli_read_all($query,$array=false){ #table //mysql_read Function
    
global $db;
    if (
$res=mysqli_query($db,$query)) {
        while (
$row=mysqli_fetch_assoc($res)) {  $ret[]=$row; } //ассоциативный
        
if (isset($ret)) { return $ret; }
        
//return $ret;
    
}
    if (
$array) { return array(); } else { return false; }

Lesha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание поля типа "Счетчик" DAO Ma4balaka БД в Delphi 3 01.12.2010 11:00
Class G. J. Cezar Visual C++ 5 18.11.2010 16:21
Delphi + Oracle + DAO habias2006 БД в Delphi 4 12.08.2010 16:38
Service и Dao Jakethefish Java для Web (EE, Servlet, JSP, Tomcat, Spring MVC) 3 13.06.2010 13:59
WebIcqPro.class.php кодировка koshkarjov PHP 3 14.07.2009 22:09