PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (2): [1] 2 »
Найдено сообщений: 21
Kenshin
Отправлено: 31 Января, 2014 - 21:43:41 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
OrmaJever пишет: Kenshin пишет: class Database
Нет, нет, нет. Класс Database нужно забыть. Я понимаю что вы сильно хотите сделать singletone, тогда вот вам функция (я использую mysqli место PDO, т.к. лучше знаю его)
PHP:
скопировать код в буфер обмена
function mysqli( )
{
static $mysqli ;
$mysqli = new mysqli( DB_HOST, DB_LOGIN, DB_PASS, DB_NAME) ;
$mysqli -> query ( 'SET NAMES `utf8`' ) ; // если нужно - изменить кодировку
}
return $mysqli ;
}
DB_HOST, DB_LOGIN, DB_PASS и DB_NAME это константы которые определены где-то в конфиге.
Использовать функцию элементарно
Плюсы очевидны
1) 7 строк, не создаём лишний код
2) функция всегда глобальна (в отличии от переменых ($mysqli))
Ну и вот далее вы используете так как я написал во втором посте этой темы (только место $mysqli пишем mysqli())
PHP:
скопировать код в буфер обмена
$p = mysqli( ) -> prepare ( "SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?" ) ;
$p -> bind_param ( 'ss' , $log_d , $p_md5 ) ;
$p -> execute ( ) ;
$stmt -> bind_result ( $mail ) ;
while ( $stmt -> fetch ( ) ) {
echo $mail ;
}
Что тут сложного?
С этим всё понятно...
Но у меня была другая задача. Незнаю или вообще можно так сделать или нет... но дело было так, напишу еще раз...
Была задача:
1. написать Класс синглетон для подключения к базе данных используя mysqli или PDO...
и другой класс, где уже обрабатывались данные с БД.
Это я вроде бы сделал... хотя криво по не опыту и не знанию... но все равно все работало....
2. Мой учитель взглянул на это все и дал задание, всё хорошо, но я должен подумать о prepared statement для минимизации SQL-инъекций...
Вот поэтому я и начал ломать голову, как это сделать и или вообще это можно сделать....
По задаче Класс синглетон должен остаться...
Вот я и не могу понять... или я совсем дурак и не понимаю.... или это мой учитель дурак и мне дурацкое задание дает....
Kenshin
Отправлено: 31 Января, 2014 - 20:02:42 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
у меня в голове уже каша после прочтения всех материалов и я полностью запутался...
Спасибо за советы. Прочитал материалы еще раз, многое понял по новому. Многое понял, что раньше не понимал. Начал заново писать. Получилось так:
PHP:
скопировать код в буфер обмена
class Database
{
public $pdo ;
static private $instance ;
public $dbOptions ;
public static function getInstance( )
{
if ( empty ( self :: $instance ) ) self :: $instance = new self ;
return self :: $instance ;
}
private function __construct( )
{
'db_host' => 'localhost' ,
'db_user' => 'user' ,
'db_pass' => 'password' ,
'db_name' => 'database'
) ;
$pdo = new PDO( "mysql:host=" . $dbOptions [ 'db_host' ] . ";dbname=" . $dbOptions [ 'db_name' ] , $dbOptions [ 'db_user' ] , $dbOptions [ 'db_pass' ] ) ;
}
private function __clone( ) { }
}
$obj = Database:: getInstance ( ) ;
$stmt = $obj -> pdo -> prepare ( "SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?" ) ;
$p -> bind_param ( 'ss' , $log_d , $p_md5 ) ;
$p -> execute ( ) ;
$stmt -> bind_result ( $mail ) ;
while ( $stmt -> fetch ( ) ) {
echo $mail ;
}
Выдает ошибку Fatal error: Call to a member function prepare() on a non-object
Что опять не так? Что я опять недопонял?
Kenshin
Отправлено: 31 Января, 2014 - 11:23:51 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
[quote=OrmaJever][/quote]
Не получается у меня разобраться....
Расскажу подробней что и как...
Есть класс Database, в нем Singleton pattern подключения к Mysql:
PHP:
скопировать код в буфер обмена
require_once 'Db_log.php' ;
class Database //Klass fцr koppling till databas
{
private static $instance ;
private $MySQLi ;
private function __construct
( array $dbOptions ) // Konstruktцr av klass {
// Koppling till MySQL server
$this -> MySQLi = @ new mysqli( $dbOptions [ 'db_host' ] ,
$dbOptions [ 'db_user' ] ,
$dbOptions [ 'db_pass' ] ,
$dbOptions [ 'db_name' ]
) ;
{
throw new Exception( 'Problem med koppling till Databas' ) ;
}
$this -> MySQLi -> set_charset ( "utf8" ) ; // Typ av kodning
}
public static
function getInstance
( array $dbOptions ) // Metod fцr ofarlig koppling {
if ( self :: $instance instanceof self )
{
return false ;
}
self :: $instance = new self ( $dbOptions ) ;
}
public static function getMySQLiObject( )
{
return self :: $instance -> MySQLi ;
}
public static function query( $q ) // Frеga till databas
{
return self :: $instance -> MySQLi -> query ( $q ) ;
}
public static function esc( $str ) // Skydd mot SQL Injection
{
}
}
Database:: getInstance ( $dbOptions ) ; // Koppling
Другой класс выполняет операции с Mysql
PHP:
скопировать код в буфер обмена
class User
{
public function readUser( )
{
.........
$query = Database:: query ( "SELECT `mail` FROM `userdata` WHERE `username`='$log_d ' AND `password`='$p_md5 '" ) ;
$base = $query -> fetch_object ( ) ;
.....
}
Как из этого всего, чтобы был singleton pattern сделать чтобы было с prepared statement?
Если можете подскажите, но не кидайте ссылки... начитался но так и не разобрался...
Мне именно надо такой вариант чтобы был Singletone pattern в одном классе... а операции с базой данных с prepared statement в другом классе..
Kenshin
Отправлено: 30 Января, 2014 - 23:01:49 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
caballero пишет: Цитата: я только учусь, вот и иногда недопонимаю всей сути проблемы и как её решить
тогда зачем берешь высосаные из пальца задачи. какое отношение твой класс имеет к MVC
Это не я сам себе придумал задачу, а получил такое практическое задание...
Kenshin
Отправлено: 30 Января, 2014 - 20:48:11 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
OrmaJever пишет: ну например тем что он высосан из пальца. Зачем делать класс для класса? В чём смысл вашего класса?
Database класс отвечает за подключение к базе данных...
другой класс выполняет другие операции...
У меня была задача по концепции MVC сделать страницу с полем для логирования, с переходом на другую страницу, для тех пользователей кто есть в базе данных... как то так...
я только учусь, вот и иногда недопонимаю всей сути проблемы и как её решить
Kenshin
Отправлено: 30 Января, 2014 - 20:16:26 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
OrmaJever пишет: Kenshin пишет: Вот мой класс Database:
выкинуть ваш класс и использовать чистый mysqli.
Чем класс плохой? Я его для MVC использовал
Kenshin
Отправлено: 30 Января, 2014 - 19:32:47 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
OrmaJever пишет: Kenshin я же блин не знаю что у вас за класс Database, я вам привёл общий пример использования, а под свой код уже сами подгоняйте
Вот мой класс Database:
PHP:
скопировать код в буфер обмена
require_once 'Db_log.php' ;
class Database //Klass fцr koppling till databas
{
private static $instance ;
private $MySQLi ;
private function __construct
( array $dbOptions ) // Konstruktцr av klass {
// Koppling till MySQL server
$this -> MySQLi = @ new mysqli( $dbOptions [ 'db_host' ] ,
$dbOptions [ 'db_user' ] ,
$dbOptions [ 'db_pass' ] ,
$dbOptions [ 'db_name' ]
) ;
{
throw new Exception( 'Problem med koppling till Databas' ) ;
}
$this -> MySQLi -> set_charset ( "utf8" ) ; // Typ av kodning
}
public static
function getInstance
( array $dbOptions ) // Metod fцr ofarlig koppling {
if ( self :: $instance instanceof self )
{
return false ;
}
self :: $instance = new self ( $dbOptions ) ;
}
public static function getMySQLiObject( )
{
return self :: $instance -> MySQLi ;
}
public static function query( $q ) // Frеga till databas
{
return self :: $instance -> MySQLi -> query ( $q ) ;
}
public static function esc( $str ) // Skydd mot SQL Injection
{
}
}
Database:: getInstance ( $dbOptions ) ; // Koppling
Читал инструкции.... но так и не разобрался как решить проблему...
Kenshin
Отправлено: 27 Января, 2014 - 21:13:12 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
не работает у меня так..... выдает ошибку:
Notice: Undefined variable: mysqli in.....
Fatal error: Call to a member function prepare() on a non-object in.....
ошибка в этой строке:
Kenshin
Отправлено: 27 Января, 2014 - 20:41:49 • Тема: Prepared statement • Форум: Администрирование БД
Ответов: 21 Просмотров: 5146
Как использовать, создавать Prepared statement?
например у меня есть код:
PHP:
скопировать код в буфер обмена
$query = Database:: query ( "SELECT `mail` FROM `userdata` WHERE `username`='$log_d ' AND `password`='$p_md5 '" ) ;
$base = $query -> fetch_object ( ) ;
if ( $mail_d == $base -> mail && ! empty ( $_POST [ 'login' ] ) && ! empty ( $_POST [ 'password' ] ) && ! empty ( $_POST [ 'mail' ] ) ) { ... }
Как это сделать через Prepared statement?
Kenshin
Отправлено: 31 Июля, 2013 - 00:08:02 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста
Ответов: 9 Просмотров: 78
[quote=Alvor][/quote]
Вот весь код:
PHP:
скопировать код в буфер обмена
<!doctype html>
<html> <head> <title>Edit Movie</title>
</head>
<body>
<fieldset> <legend>Edit Movie</legend>
<form action="Edit.php" method="post">
<?PHP
require_once 'Db_log.php' ; // only once
$db_connect = mysql_connect ( $db_hostname , $db_username , $db_password ) ; // connect to Mysql if ( ! $db_connect ) die ( "You can not connect to Mysql" ) ;
if ( ! $db_select ) die ( "You can not connect to Mysql" ) ;
$id = sanitizeString ( $_GET [ 'edit' ] ) ;
$edit_m = mysql_query ( "SELECT * FROM movies WHERE id=$id " ) ; {
$t = $row [ 1] ;
$d = $row [ 2] ;
$y = $row [ 3] ;
$ci = $row [ 0] ;
$cat = mysql_query ( "SELECT * FROM categories WHERE cat_id='$row[4] '" ) ; {
$c = $row_c [ 1] ;
}
echo '<p> Title <input type="text" name="Title"/ value="' . $t . '">
Director <input type="text" name="Director" value="' . $d . '"/>
Year <input type="number" min="1895" max="2015" name="Year" value="' . $y . '"/>
Category <Select name="Category">
<Option value="' . $id . '">' . $c . ' (Previous Category)</Option>
<Option></Option>' ;
}
{
echo '<option value="' . $row [ '0' ] . '">' . $row [ '1' ] . '</option>' ;
}
echo '</select> </p>
<input type="submit" name="but" value="Edit"/>
</form></fieldset></body></html>' ;
if ( isset ( $_POST [ 'Title' ] ) && isset ( $_POST [ 'Director' ] ) && isset ( $_POST [ 'Year' ] ) && isset ( $_POST [ 'Category' ] ) && isset ( $_POST [ 'but' ] ) ) {
$Title = sanitizeString ( $_POST [ 'Title' ] ) ;
$Director = sanitizeString ( $_POST [ 'Director' ] ) ;
$Year = sanitizeString ( $_POST [ 'Year' ] ) ;
$Category = sanitizeString ( $_POST [ 'Category' ] ) ;
$query = "UPDATE movies SET Title='$Title ', Director='$Director ', Year='$Year ' WHERE id='$id '" ;
}
function sanitizeString ( $string ) // Preventing SQL Injection
{
$string = htmlentities ( $string ) ; // Convert some characters to HTML entities $string = Strip_tags ( $string ) ; // Strip the string from HTML tags return $string ;
}
function get_post( $var )
{
}
?>
(Добавление)
Может еще что-то где-то подскажете новичку... где-то подскажете как лучше подправить...
Kenshin
Отправлено: 30 Июля, 2013 - 00:15:20 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста
Ответов: 9 Просмотров: 78
DelphinPRO пишет: Kenshin пишет: Куда пропало значение переменной $id ?????????????
Очевидно, что где-то перезаписалось ;) смотрите внимательно код.
Все пересмотрел... нигде больше $id не используется... и не переписуется....
(Добавление)
Kenshin пишет: DelphinPRO пишет: Kenshin пишет: Куда пропало значение переменной $id ?????????????
Очевидно, что где-то перезаписалось ;) смотрите внимательно код.
Все пересмотрел... нигде больше $id не используется... и не переписуется....
Может вывести весь код? а то я уже все пересмотрел и ничего не нашел....
Kenshin
Отправлено: 29 Июля, 2013 - 23:53:45 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста
Ответов: 9 Просмотров: 78
[quote=Alvor][/quote]
Пишет:
Но перед нажатием кнопки.... проблем с с этим edit нету....
Вывел и $_GET['edit'] и sanitizeString $id в файл...и один и другой выводят в файл число 19, то что мне нужно..
Вывел в файл $query и результат:
Куда пропало значение переменной $id ?????????????
Kenshin
Отправлено: 29 Июля, 2013 - 21:22:43 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста
Ответов: 9 Просмотров: 78
При отправке измененных данных в БД не хочет использовать данные из $_GET
PHP:
скопировать код в буфер обмена
...
$id = sanitizeString ( $_GET [ 'edit' ] ) ;
....
if ( isset ( $_POST [ 'Title' ] ) && isset ( $_POST [ 'Director' ] ) && isset ( $_POST [ 'Year' ] ) && isset ( $_POST [ 'Category' ] ) && isset ( $_POST [ 'but' ] ) ) {
$Title = sanitizeString ( $_POST [ 'Title' ] ) ;
$Director = sanitizeString ( $_POST [ 'Director' ] ) ;
$Year = sanitizeString ( $_POST [ 'Year' ] ) ;
$Category = sanitizeString ( $_POST [ 'Category' ] ) ;
$query = "UPDATE movies SET Title='$Title ', Director='$Director ', Year='$Year ' WHERE id='$id '" ;
if ( ! $result ) die ( "Error" ) ;
}
....
Ошибки Error не выдает. При том что при использовании другой операции с переменной $id на той же странице, никаких проблем нету.
Например:
В чем проблема?
Страниц (2): [1] 2 »
Powered by ExBB FM 1.0 RC1. InvisionExBB