Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: PHP Класс для работы с MYSQL
 
 автор: pavluxa09   (14.02.2010 в 20:31)   письмо автору
 
 

Хотел поделится хорошим классом для работы с MYSQL. Он удобен тем, что в нём есть возможность фильтровать данные перед тем как вставить их в MYSQL, тем самым защититься от SQL Инъекций.


class db_mysql
{
    function db_mysql($host, $user, $db_pass, $db)
    {
        $this->host = $host;
        $this->user = $user;
        $this->db_pass = $db_pass;
        $this->db = $db;
    }
    function db_connect()
    {
        if(!($this->connect = @mysql_connect($this->host, $this->user, $this->db_pass)))
        {
            $this->false = 'Connection Error';
            return false;
        }
        return (!@mysql_select_db($this->db,$this->connect))? false : true;
    }
    function db_query()
    {
        $this->args = func_get_args();
        $qwery = $this->db_make_query();
        return $result = mysql_query($qwery,$this->connect);
        mysql_free_result($result);
    }
    function db_make_query()
    {
        $tml = $this->args;
        $tml[0] = str_replace('%', '%%', $tml[0]);
        $tml[0] = str_replace('?', '%s', $tml[0]);
        foreach ($tml as $i => $v)
        {
            if (!$i) continue;
            if (is_int($v)) continue;
            if (get_magic_quotes_gpc()) $v = stripslashes($v);
            $tml[$i] = "'" . mysql_real_escape_string($v,$this->connect) . "'";
        }
        for ($i = $c = count($tml) - 1; $i < $c + 20; $i++)
        {
            $tml[$i + 1] = "UNKNOWN_PLACEHOLDER_$i";
            return call_user_func_array("sprintf", $tml);
        }
    }
    function db_fetch_array($result)
    {
        return mysql_fetch_assoc($result);
    }
    function db_num_rows($result)
    {
        return mysql_num_rows($result);
    }
    function db_error()
    {
        return (@mysql_error($this->connect))? mysql_error($this->connect): $this->false;
    }
    function db_close()
    {
        @mysql_close($this->connect);
    }
}


Для того чтоб вызвать класс достаточно применить такой код

<?php
include("нашкласс.php");
$db = new db_mysql"localhost","username","password","basename" );
if ( !
$db->db_connect() ) die("Error connection to MYSQL");
?>


Работает обработка на практике следующим образом:

<?php
include("нашкласс.php");
$db = new db_mysql"localhost","username","password","basename" );
if ( !
$db->db_connect() ) die("Error connection to MYSQL");
$name "имя";
$value "значение";
$db->db_query("UPDATE `table` SET `value` = ? WHERE `name` = ? LIMIT 1"$name,$value);
?>


Пожалуйста, если у кого-то есть что-то получше напишите!

  Ответить  
 
 автор: Trianon   (14.02.2010 в 20:40)   письмо автору
 
   для: pavluxa09   (14.02.2010 в 20:31)
 

Кошмар.
Еще одно творение доктора Франкельштейна, который не отличает параметров скрипта от параметров метода.

  Ответить  
 
 автор: pavluxa09   (14.02.2010 в 20:42)   письмо автору
 
   для: Trianon   (14.02.2010 в 20:40)
 

Предложи что лучше

  Ответить  
 
 автор: Тень&   (14.02.2010 в 20:47)   письмо автору
 
   для: pavluxa09   (14.02.2010 в 20:42)
 

[поправлено модератором]

  Ответить  
 
 автор: pavluxa09   (14.02.2010 в 20:48)   письмо автору
 
   для: Тень&   (14.02.2010 в 20:47)
 

Предложи что лучше. Я же не просто так создал тему в помощь молодежи, а чтоб узнать что есть получше.

  Ответить  
 
 автор: vtos   (15.02.2010 в 11:35)   письмо автору
 
   для: pavluxa09   (14.02.2010 в 20:48)
 

Из всего вышеприведенного реальную пользу можно получить вот от этого (даже догадываюсь, откуда этот код... :) :
 
    function db_make_query()
    {
        $tml = $this->args;
        $tml[0] = str_replace('%', '%%', $tml[0]);
        $tml[0] = str_replace('?', '%s', $tml[0]);
        foreach ($tml as $i => $v)
        {
            if (!$i) continue;
            if (is_int($v)) continue;
            if (get_magic_quotes_gpc()) $v = stripslashes($v);
            $tml[$i] = "'" . mysql_real_escape_string($v,$this->connect) . "'";
        }
        for ($i = $c = count($tml) - 1; $i < $c + 20; $i++)
        {
            $tml[$i + 1] = "UNKNOWN_PLACEHOLDER_$i";
            return call_user_func_array("sprintf", $tml);
        }
    } 

Правда этот код еще нужно "почистить".

Только зачем эту функцию реализовывать через класс и методы? Можно было просто написать эту функцию отдельно и потом подключать. Вот именно она-то и может помочь защититься от SQL-вставок...

Скока раз уже говорили: класс для БД нужно разрабатывать так, чтобы он мог работать с разными БД (MySQL, PostgreSQL и др.)...
Только тогда он имеет смысл. Зачем писать просто обертки для стандартных функций PHP? В них нет никакого смысла и уж тем более удобства.

  Ответить  
 
 автор: Trianon   (14.02.2010 в 21:20)   письмо автору
 
   для: pavluxa09   (14.02.2010 в 20:42)
 

Для начала следует убрать вот эту строку

 if (get_magic_quotes_gpc()) $v = stripslashes($v); 

  Ответить  
 
 автор: ddhvvn   (14.02.2010 в 21:20)   письмо автору
 
   для: pavluxa09   (14.02.2010 в 20:31)
 

>Хотел поделится хорошим классом для работы с MYSQL

http://php.net/mysqli

  Ответить  
 
 автор: pavluxa09   (15.02.2010 в 17:12)   письмо автору
 
   для: ddhvvn   (14.02.2010 в 21:20)
 

Не моглибы помочь составить функцию которая будет фильтровать строку чтоб потом её можно было безопасно использовать при SQL запросе?

  Ответить  
 
 автор: Loki   (15.02.2010 в 18:01)   письмо автору
 
   для: pavluxa09   (14.02.2010 в 20:31)
 

>if (get_magic_quotes_gpc()) $v = stripslashes($v);
убило наповал

  Ответить  
 
 автор: cheops   (17.02.2010 в 13:52)   письмо автору
 
   для: Loki   (15.02.2010 в 18:01)
 

Почему? Многие кстати, именно этот способ пропагандируют - он более безопасен в плане повторного экранирования.

  Ответить  
 
 автор: Николай2357   (17.02.2010 в 13:56)   письмо автору
 
   для: cheops   (17.02.2010 в 13:52)
 

Потому что не факт, что это внешние данные.

  Ответить  
 
 автор: Trianon   (17.02.2010 в 14:25)   письмо автору
 
   для: Николай2357   (17.02.2010 в 13:56)
 

А если даже внешние, то не факт, что очистка массивов от magic quotes к моменту обращения к БД уже не была проведена.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования