|
|
|
| Хотел поделится хорошим классом для работы с 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);
?>
|
Пожалуйста, если у кого-то есть что-то получше напишите! | |
|
|
|
|
|
|
|
для: pavluxa09
(14.02.2010 в 20:31)
| | Кошмар.
Еще одно творение доктора Франкельштейна, который не отличает параметров скрипта от параметров метода. | |
|
|
|
|
|
|
|
для: Trianon
(14.02.2010 в 20:40)
| | Предложи что лучше | |
|
|
|
|
|
|
|
для: pavluxa09
(14.02.2010 в 20:42)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Тень&
(14.02.2010 в 20:47)
| | Предложи что лучше. Я же не просто так создал тему в помощь молодежи, а чтоб узнать что есть получше. | |
|
|
|
|
|
|
|
для: 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? В них нет никакого смысла и уж тем более удобства. | |
|
|
|
|
|
|
|
для: pavluxa09
(14.02.2010 в 20:42)
| | Для начала следует убрать вот эту строку
if (get_magic_quotes_gpc()) $v = stripslashes($v);
|
| |
|
|
|
|
|
|
|
для: pavluxa09
(14.02.2010 в 20:31)
| | >Хотел поделится хорошим классом для работы с MYSQL
http://php.net/mysqli | |
|
|
|
|
|
|
|
для: ddhvvn
(14.02.2010 в 21:20)
| | Не моглибы помочь составить функцию которая будет фильтровать строку чтоб потом её можно было безопасно использовать при SQL запросе? | |
|
|
|
|
|
|
|
для: pavluxa09
(14.02.2010 в 20:31)
| | >if (get_magic_quotes_gpc()) $v = stripslashes($v);
убило наповал | |
|
|
|
|
|
|
|
для: Loki
(15.02.2010 в 18:01)
| | Почему? Многие кстати, именно этот способ пропагандируют - он более безопасен в плане повторного экранирования. | |
|
|
|
|
|
|
|
для: cheops
(17.02.2010 в 13:52)
| | Потому что не факт, что это внешние данные. | |
|
|
|
|
|
|
|
для: Николай2357
(17.02.2010 в 13:56)
| | А если даже внешние, то не факт, что очистка массивов от magic quotes к моменту обращения к БД уже не была проведена. | |
|
|
|