PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (2): [1] 2 »

> Найдено сообщений: 21
Kenshin Отправлено: 31 Января, 2014 - 21:43:41 • Тема: Prepared statement • Форум: Администрирование БД

Ответов: 21
Просмотров: 5146
OrmaJever пишет:
Kenshin пишет:
class Database

Нет, нет, нет. Класс Database нужно забыть. Я понимаю что вы сильно хотите сделать singletone, тогда вот вам функция (я использую mysqli место PDO, т.к. лучше знаю его)
PHP:
скопировать код в буфер обмена
  1. function mysqli()
  2. {
  3.         static $mysqli;
  4.         if(is_null($mysqli)) {
  5.                 $mysqli = new mysqli(DB_HOST, DB_LOGIN, DB_PASS, DB_NAME);
  6.                 $mysqli->query('SET NAMES `utf8`'); // если нужно - изменить кодировку
  7.         }
  8.         return $mysqli;
  9. }

DB_HOST, DB_LOGIN, DB_PASS и DB_NAME это константы которые определены где-то в конфиге.
Использовать функцию элементарно
PHP:
скопировать код в буфер обмена
  1. mysqli()->query(...);
  2. mysqli()->num_rows;
  3. $p = mysqli()->prepare(...);
  4. // и т.к. любые методы и свойства

Плюсы очевидны
1) 7 строк, не создаём лишний код
2) функция всегда глобальна (в отличии от переменых ($mysqli))

Ну и вот далее вы используете так как я написал во втором посте этой темы (только место $mysqli пишем mysqli())
PHP:
скопировать код в буфер обмена
  1. $p = mysqli()->prepare("SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?");
  2. $p->bind_param('ss', $log_d, $p_md5);
  3. $p->execute();
  4. $stmt->bind_result($mail);
  5. while ($stmt->fetch()) {
  6.    echo $mail;
  7. }

Что тут сложного?

С этим всё понятно...
Но у меня была другая задача. Незнаю или вообще можно так сделать или нет... но дело было так, напишу еще раз...
Была задача:
1. написать Класс синглетон для подключения к базе данных используя mysqli или PDO...
и другой класс, где уже обрабатывались данные с БД.
Это я вроде бы сделал... хотя криво по не опыту и не знанию... но все равно все работало....
2. Мой учитель взглянул на это все и дал задание, всё хорошо, но я должен подумать о prepared statement для минимизации SQL-инъекций...

Вот поэтому я и начал ломать голову, как это сделать и или вообще это можно сделать....
По задаче Класс синглетон должен остаться...
Вот я и не могу понять... или я совсем дурак и не понимаю.... или это мой учитель дурак и мне дурацкое задание дает....
Kenshin Отправлено: 31 Января, 2014 - 20:02:42 • Тема: Prepared statement • Форум: Администрирование БД

Ответов: 21
Просмотров: 5146
у меня в голове уже каша после прочтения всех материалов и я полностью запутался...
Спасибо за советы. Прочитал материалы еще раз, многое понял по новому. Многое понял, что раньше не понимал. Начал заново писать. Получилось так:

PHP:
скопировать код в буфер обмена
  1.  
  2. class Database
  3. {
  4.     public      $pdo;
  5.     static private $instance;
  6.         public $dbOptions;
  7.        
  8.          public static function getInstance()
  9.     {        
  10.         if(empty(self::$instance))  
  11.             self::$instance = new self;
  12.        
  13.         return self::$instance;
  14.     }    
  15.  
  16.          private function __construct()
  17.     {
  18.        
  19.         $dbOptions = array(
  20.           'db_host' => 'localhost',
  21.           'db_user' => 'user',
  22.           'db_pass' => 'password',
  23.           'db_name' => 'database'  
  24.         );
  25.        
  26.        $pdo = new PDO("mysql:host=". $dbOptions['db_host'] .";dbname=". $dbOptions['db_name'], $dbOptions['db_user'], $dbOptions['db_pass']);
  27.     }
  28.        
  29.            
  30.     private function __clone(){}
  31. }
  32.  
  33. $obj = Database::getInstance();
  34.  
  35.  
  36.  
  37. $stmt = $obj->pdo->prepare("SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?");
  38. $p->bind_param('ss', $log_d, $p_md5);
  39. $p->execute();
  40. $stmt->bind_result($mail);
  41. while ($stmt->fetch()) {
  42. echo $mail;
  43. }
  44.  


Выдает ошибку 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:
скопировать код в буфер обмена
  1.  
  2. require_once 'Db_log.php';
  3.  
  4. class Database //Klass fцr koppling till databas
  5. {
  6.     private static $instance;
  7.     private $MySQLi;
  8.        
  9.     private function __construct(array $dbOptions)  // Konstruktцr av klass
  10.         {
  11.         // Koppling till MySQL server
  12.                 $this->MySQLi = @ new mysqli($dbOptions['db_host'],
  13.                                      $dbOptions['db_user'],
  14.                                      $dbOptions['db_pass'],
  15.                                      $dbOptions['db_name']
  16.                                     );
  17.        
  18.         if(mysqli_connect_errno())// Undantag om ska vara problem under koppling till databas
  19.                 {
  20.             throw new Exception('Problem med koppling till Databas');
  21.         }
  22.              
  23.         $this->MySQLi->set_charset("utf8"); // Typ av kodning
  24.     }
  25.  
  26.     public static function getInstance(array $dbOptions) // Metod fцr ofarlig koppling
  27.         {
  28.         if(self::$instance instanceof self)
  29.                 {
  30.             return false;
  31.         }
  32.                
  33.         self::$instance = new self($dbOptions);
  34.     }
  35.  
  36.     public static function getMySQLiObject()
  37.         {
  38.         return self::$instance->MySQLi;
  39.     }
  40.  
  41.          
  42.     public static function query($q) // Frеga till databas
  43.         {
  44.         return self::$instance->MySQLi->query($q);
  45.     }
  46.  
  47.     public static function esc($str) // Skydd mot SQL Injection
  48.         {
  49.         return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str));
  50.     }
  51. }
  52.        
  53. Database::getInstance($dbOptions); // Koppling
  54.  


Другой класс выполняет операции с Mysql

PHP:
скопировать код в буфер обмена
  1.  
  2. class User  
  3. {
  4.  
  5.     public function readUser()
  6.     {
  7.     .........
  8.    
  9.     $query = Database::query("SELECT `mail` FROM `userdata` WHERE `username`='$log_d' AND `password`='$p_md5'");
  10.     $base = $query->fetch_object();
  11. .....
  12. }
  13.  

Как из этого всего, чтобы был 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:
скопировать код в буфер обмена
  1.  
  2.  require_once 'Db_log.php';
  3.  
  4. class Database //Klass fцr koppling till databas
  5. {
  6.     private static $instance;
  7.     private $MySQLi;
  8.        
  9.     private function __construct(array $dbOptions)  // Konstruktцr av klass
  10.         {
  11.         // Koppling till MySQL server
  12.                 $this->MySQLi = @ new mysqli($dbOptions['db_host'],
  13.                                      $dbOptions['db_user'],
  14.                                      $dbOptions['db_pass'],
  15.                                      $dbOptions['db_name']
  16.                                     );
  17.        
  18.         if(mysqli_connect_errno())// Undantag om ska vara problem under koppling till databas
  19.                 {
  20.             throw new Exception('Problem med koppling till Databas');
  21.         }
  22.              
  23.         $this->MySQLi->set_charset("utf8"); // Typ av kodning
  24.     }
  25.  
  26.     public static function getInstance(array $dbOptions) // Metod fцr ofarlig koppling
  27.         {
  28.         if(self::$instance instanceof self)
  29.                 {
  30.             return false;
  31.         }
  32.                
  33.         self::$instance = new self($dbOptions);
  34.     }
  35.  
  36.     public static function getMySQLiObject()
  37.         {
  38.         return self::$instance->MySQLi;
  39.     }
  40.  
  41.          
  42.     public static function query($q) // Frеga till databas
  43.         {
  44.         return self::$instance->MySQLi->query($q);
  45.     }
  46.  
  47.     public static function esc($str) // Skydd mot SQL Injection
  48.         {
  49.         return self::$instance->MySQLi->real_escape_string(htmlspecialchars($str));
  50.     }
  51. }
  52.        
  53. Database::getInstance($dbOptions); // Koppling
  54.  


Читал инструкции.... но так и не разобрался как решить проблему... Однако
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.....

ошибка в этой строке:
PHP:
скопировать код в буфер обмена
  1.         $p = $mysqli->prepare("SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?");
  2.  
Kenshin Отправлено: 27 Января, 2014 - 20:41:49 • Тема: Prepared statement • Форум: Администрирование БД

Ответов: 21
Просмотров: 5146
Как использовать, создавать Prepared statement?
например у меня есть код:

PHP:
скопировать код в буфер обмена
  1.  
  2. $query = Database::query("SELECT `mail` FROM `userdata` WHERE `username`='$log_d' AND `password`='$p_md5'");
  3. $base = $query->fetch_object();
  4.                
  5.                 if ($mail_d == $base->mail && !empty($_POST['login']) && !empty($_POST['password']) && !empty($_POST['mail']))
  6.                 {...}
  7.  


Как это сделать через Prepared statement? Однако
Kenshin Отправлено: 31 Июля, 2013 - 18:23:43 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста

Ответов: 9
Просмотров: 78
Все проблему решил... изменил action в <form> с
CODE (html):
скопировать код в буфер обмена
  1.  
  2. form action="Edit.php" method="post">
  3.  

на
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form action="Edit.php?edit='.$id.'" method="post">
  3.  

и теперь все работает.
Kenshin Отправлено: 31 Июля, 2013 - 00:08:02 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста

Ответов: 9
Просмотров: 78
[quote=Alvor][/quote]

Вот весь код:

PHP:
скопировать код в буфер обмена
  1.  
  2. <!doctype html>
  3. <html> <head> <title>Edit Movie</title>
  4. </head>
  5.  <body>
  6.  <fieldset> <legend>Edit Movie</legend>
  7.  <form action="Edit.php" method="post">
  8. <?PHP
  9.  
  10. require_once 'Db_log.php'; // only once
  11. $db_connect = mysql_connect ($db_hostname, $db_username, $db_password); // connect to Mysql
  12. if (!$db_connect) die("You can not connect to Mysql");
  13.  
  14. $db_select = mysql_select_db ($db_database); //Select Database
  15. if (!$db_select) die("You can not connect to Mysql");
  16.  
  17. $id= sanitizeString ($_GET['edit']);
  18.  
  19. file_put_contents ("out1.txt", $id);
  20.  
  21. file_put_contents ("out2.txt", $_GET['edit']);
  22.  
  23. $edit_m=mysql_query("SELECT * FROM movies WHERE id=$id");
  24. while ($row= mysql_fetch_row($edit_m))
  25. {
  26. $t= $row[1];
  27. $d= $row[2];
  28. $y= $row[3];
  29. $ci = $row[0];
  30.  
  31. $cat=mysql_query("SELECT * FROM categories WHERE cat_id='$row[4]'");
  32. while ($row_c= mysql_fetch_row($cat))
  33. {
  34. $c= $row_c[1];
  35. }
  36.  
  37. echo '<p> Title  <input type="text" name="Title"/ value="'.$t.'">
  38.  Director  <input type="text" name="Director" value="'.$d.'"/>
  39.  Year  <input type="number" min="1895" max="2015" name="Year" value="'.$y.'"/>
  40.  Category  <Select name="Category">
  41.  <Option value="'.$id.'">'.$c.' (Previous Category)</Option>
  42.  <Option></Option>';
  43.   }
  44.  
  45.  
  46.   $query = mysql_query ("SELECT * FROM categories");
  47.    
  48.     while($row = mysql_fetch_row($query))
  49.     {
  50.       echo '<option value="' . $row['0'] . '">' . $row['1'] . '</option>';
  51.     }
  52.   echo '</select> </p>
  53. <input type="submit" name="but" value="Edit"/>
  54. </form></fieldset></body></html>';
  55.  
  56.  
  57.  if (isset($_POST['Title']) && isset($_POST['Director']) && isset($_POST['Year']) && isset($_POST['Category']) && isset($_POST['but']))
  58. {
  59.  
  60. $Title= sanitizeString ($_POST['Title']);
  61. $Director= sanitizeString ($_POST['Director']);
  62. $Year= sanitizeString ($_POST['Year']);
  63. $Category= sanitizeString ($_POST['Category']);
  64.  
  65. $query = "UPDATE movies SET Title='$Title', Director='$Director', Year='$Year' WHERE id='$id'";
  66. $result = mysql_query ($query)
  67.  }
  68.  
  69.  
  70.  
  71. function sanitizeString ($string) // Preventing SQL Injection
  72. {
  73. $string = stripslashes($string); // Remove the backslash
  74. $string = htmlentities($string); // Convert some characters to HTML entities
  75. $string = Strip_tags($string); // Strip the string from HTML tags
  76. return mysql_real_escape_string($string); // escapes special characters in a string for use in an SQL statement
  77. return $string;
  78. }
  79.  
  80.  
  81. function get_post($var)
  82. {
  83. return mysql_real_escape_string ($_POST[$var]);
  84. }
  85.  
  86.  
  87. ?>
  88.  

(Добавление)
Может еще что-то где-то подскажете новичку... где-то подскажете как лучше подправить... Однако
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]
Пишет:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Notice: Undefined index: edit  on line 16
  3.  
  4. Notice: Undefined index: edit  on line 20
  5.  
  6. Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given on line 23
  7.  

Но перед нажатием кнопки.... проблем с с этим edit нету....

Вывел и $_GET['edit'] и sanitizeString $id в файл...и один и другой выводят в файл число 19, то что мне нужно..

Вывел в файл $query и результат:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. UPDATE movies SET Title='Film1', Director='Director1', Year='2000' WHERE id=''
  3.  


Куда пропало значение переменной $id ????????????? Не понял
Kenshin Отправлено: 29 Июля, 2013 - 21:22:43 • Тема: Проблема с $_GET • Форум: Напишите за меня, пожалуйста

Ответов: 9
Просмотров: 78
При отправке измененных данных в БД не хочет использовать данные из $_GET
PHP:
скопировать код в буфер обмена
  1.  
  2. ...
  3. $id= sanitizeString ($_GET['edit']);
  4. ....
  5.  
  6.  if (isset($_POST['Title']) && isset($_POST['Director']) && isset($_POST['Year']) && isset($_POST['Category']) && isset($_POST['but']))
  7. {
  8.  
  9. $Title= sanitizeString ($_POST['Title']);
  10. $Director= sanitizeString ($_POST['Director']);
  11. $Year= sanitizeString ($_POST['Year']);
  12. $Category= sanitizeString ($_POST['Category']);
  13.  
  14. $query = "UPDATE movies SET Title='$Title', Director='$Director', Year='$Year' WHERE id='$id'";
  15. $result = mysql_query ($query);
  16. if (!$result) die ("Error");
  17.  
  18. }
  19. ....
  20.  


Ошибки Error не выдает. При том что при использовании другой операции с переменной $id на той же странице, никаких проблем нету.
Например:

PHP:
скопировать код в буфер обмена
  1.  
  2. .....
  3. $edit_m=mysql_query("SELECT * FROM movies WHERE id=$id");
  4. while ($row= mysql_fetch_row($edit_m))
  5. {
  6. $t= $row[1];
  7. $d= $row[2];
  8. $y= $row[3];
  9. $ci = $row[0];
  10. }
  11. .....
  12.  


В чем проблема?
Kenshin Отправлено: 27 Июля, 2013 - 15:29:20 • Тема: максимальное значение ID в mysql. • Форум: Напишите за меня, пожалуйста

Ответов: 7
Просмотров: 83
Alvor пишет:
Kenshin пишет:
Да, так работает Хм
Спасибо! Улыбка

Обращайся, а для спасибо есть кнопка Подмигивание


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

Страниц (2): [1] 2 »
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB