[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Класс для работы с БД
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
Astin
Честно сказать мне не нравятся сложные запросы в конструкторе.
Очень удобно с одной стороны что, к примеру, есть простой метод полной или частичной выборки, и есть алтернативный ввод запроса ручками, это скорее касается сложных запросов с джоинами и так далее. Когда ручками вводишь сложные запросы как то логика в голове быстрее срабатывает как нужно составить запрос, а с конструкторами от фреймфорков путаешься
Astin
Цитата
Где и как применяется.

К примеру метод get_results (он без вложенного запроса ), В этот метод нужно вводить запрос ручками, вот и метод check_safe_collation сопоставляет запрос (в нем и находится метод get_table_from_query) для проверки
 
protected static function check_safe_collation( $query ) {

if( self::$checking_collation ) {
return true;
}

// Не проверяем сортировку для запросов, которые не читают данные.
$query = ltrim($query, "\r\n\t (");
if( preg_match('/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $query) ) {
return true;
}

// Все запросы ASCII не требуют дополнительной проверки.
if( self::check_ascii($query) ) {
return true;
}

$table = self::get_table_from_query($query);
if( ! $table ) {
return false;
}

return true;
}
twin
Цитата (Astin @ 22.05.2018 - 11:50)
В этот метод нужно вводить запрос ручками
Другими словами ты не доверяешь сам себе, и по этой причине перегружаешь класс такими мудреными проверками?




_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Эли4ка
Цитата
А вы вообще Эли4ка поняли для чего эти регулярки get_table_from_query

Да laugh.gif но их использовать не хочу. Обхожусь другим.
Цитата
Вы мне писали про обработку входящих данных что я их только эскепю.

Вы вот как обрабатываете в своем классе входящие данные?

Вот так же, как у Николая, гляньте, может поймете, что я хотела от вас под словом эскейпю.
Тыц
Цитата
Эли4ка глянул ваш пост http://phpforum.su/index.php?showtopic=93449

Вы так же, как и я, для начала взяли класс Twina

Взяла и?

Посмотрите(Николай уже давал ссылку, но я повторюсь), обратите внимание на то, как делаются запросы, надеюсь про текучий интерфейс слышали и как препарируются данные. Никаких функций отдельно вызывать не надо.
ТЫЦ
Так что например либо ваш либо класс Николая-я выберу второй, а вы продолжайте упрямиться и доказывать, что это для себя. Когда будете все это дело монетизировать ваш продукт не будет пользоваться популярностью, сразу поймете.
Astin
У меня конструкция

if( $res ) {

// Если есть результаты
if( mysqli_num_rows($res) ) {



//Здесь результат

}
// Освобождаем ресурсы
mysqli_free_result($res);



В разных методах возвращает результат по разному

В getResults

while( $row = mysqli_fetch_assoc($res) ) {
$rv[] = $row;
}


В getVar

$row = mysqli_fetch_assoc($res);

if( $row ) {
$rv = $row[$colum];
}



В getCol

while( $row = mysqli_fetch_assoc($res) ) {
$rv[] = $row[$colum];
}



В getRow

$row = mysqli_fetch_assoc($res);

if( $row ) {
$rv = $row;
}



И как это вынести в отдельный метод я не знаю
Astin
Цитата

Так что например либо ваш либо класс Николая-я выберу второй, а вы продолжайте упрямиться и доказывать, что это для себя. Когда будете все это дело монетизировать ваш продукт не будет пользоваться популярностью, сразу поймете.

Эли4ка я не собираюсь его монетезировать. У вас с головой все в порядке?
Если бы я хотел это монетезировать то не выкладывал бы ссылку на скачмвание и весь код. И я не упрямлюсь

Цитата
Вот так же, как у Николая, гляньте, может поймете, что я хотела от вас под словом эскейпю.

А вот это что у николая?

protected function createSqlString($params)
{
$sql = $this->rawSql;

foreach ($params['types'] as $k => $type) {
$value = $this->escape($params['vars'][$k], $type);
$sql = preg_replace('#\?#', $value, $sql, 1);
}

return $sql;
}

/**
* Обрабатывает параметры для дебаггинга в зависимости от типа.
*
*
@param string $param
*
@param string $type
*
*
@return string
*/

protected function escape($param, $type)
{
switch ($type) {
case 'i' :
return (int)$param;

case 'd' :
return "'". (float)$param ."'";

case 's' :
case 'b' :
return "'". $this->mysqli->real_escape_string($param) ."'";

default :
AbcError::invalidArgument('Component Mysqli: '. ABC_NO_MYSQLI_TYPE . $type);
}
}



А у меня, к примеру

public static function escape( $data ) {
if(is_array($data))
$data = array_map('self::escape', $data);
else
$data = mysqli_real_escape_string(self::$link, $data);
return $data;
}

public static function prepare( $query, $args ) {
if( is_null($query) )
return;

$args = func_get_args();
array_shift($args);

if( isset($args[0]) && is_array($args[0]) )
$args = $args[0];
$query = str_replace( "'%s'", '%s', $query ); // убираем одинарные кавычки
$query = str_replace( '"%s"', '%s', $query ); // убираем двойные кавычки
$query = preg_replace( '|(?<!%)%f|' , '%F', $query );
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query );

$args = self::escape($args);

return @vsprintf( $query, $args );
}

public static function insert( $table, $data, $format = null ) {
return self::insert_helper( $table, $data, $format, 'INSERT' );
}

public static function insert_helper( $table, $data, $format = null, $type = 'INSERT' ) {

if ( ! is_array($data) ) {
return false;
}

$formats = $values = array();

$type = strtoupper($type);

$data = self::process_formats($data, $format);
if( false === $data ) {
return false;
}

foreach ( $data as $value ) {
if ( is_null( $value['value'] ) ) {
$formats[] = 'NULL';
continue;
}

$formats[] = $value['format'];
$values[] = $value['value'];
}

$fields = '`' . implode( '`, `', array_keys( $data ) ) . '`';
$formats = implode( ', ', $formats );

$sql = "$type INTO `$table` ($fields) VALUES ($formats)";

self::$check_current_query = false;
self::Query( self::prepare($sql, $values) );

$id = self::insertId();

return $id;
}


Я вас не заставляю использовать мой класс, берите что вам угодно. Надоело вам пояснять что до того как данные приходят в запрос их по любому нужно валидировать, не зависимо будете вы их эскейпить или нет
Быстрый ответ:

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