Форумы портала PHP.SU » Серверное администрирование » Администрирование БД » Prepared statement

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

1. Kenshin - 27 Января, 2014 - 20:41:49 - перейти к сообщению
Как использовать, создавать 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? Однако
2. OrmaJever - 27 Января, 2014 - 20:54:26 - перейти к сообщению
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. }

Хотя лично я prepare использую только для insert/update, для селекта обычный query.
(Добавление)
А вот ссылка с примером
http://www.php.net/manual/ru/mys...i-stmt.fetch.php
3. Kenshin - 27 Января, 2014 - 21:13:12 - перейти к сообщению
не работает у меня так..... выдает ошибку:
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.  
4. peters - 27 Января, 2014 - 21:35:14 - перейти к сообщению
прочитайте про mysqli:
http://www.php.su/articles/?cat=...pdb&page=010


PHP:
скопировать код в буфер обмена
  1. $mysqli = new mysqli('localhost', 'user', 'password', 'world');
5. OrmaJever - 27 Января, 2014 - 21:54:12 - перейти к сообщению
Kenshin я же блин не знаю что у вас за класс Database, я вам привёл общий пример использования, а под свой код уже сами подгоняйте
6. Kenshin - 30 Января, 2014 - 19:32:47 - перейти к сообщению
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.  


Читал инструкции.... но так и не разобрался как решить проблему... Однако
7. OrmaJever - 30 Января, 2014 - 20:09:23 - перейти к сообщению
Kenshin пишет:
Вот мой класс Database:

выкинуть ваш класс и использовать чистый mysqli.
8. Kenshin - 30 Января, 2014 - 20:16:26 - перейти к сообщению
OrmaJever пишет:
Kenshin пишет:
Вот мой класс Database:

выкинуть ваш класс и использовать чистый mysqli.


Чем класс плохой? Я его для MVC использовал
9. OrmaJever - 30 Января, 2014 - 20:23:35 - перейти к сообщению
ну например тем что он высосан из пальца. Зачем делать класс для класса? В чём смысл вашего класса?
10. Kenshin - 30 Января, 2014 - 20:48:11 - перейти к сообщению
OrmaJever пишет:
ну например тем что он высосан из пальца. Зачем делать класс для класса? В чём смысл вашего класса?

Database класс отвечает за подключение к базе данных...
другой класс выполняет другие операции...
У меня была задача по концепции MVC сделать страницу с полем для логирования, с переходом на другую страницу, для тех пользователей кто есть в базе данных... как то так...
я только учусь, вот и иногда недопонимаю всей сути проблемы и как её решить
11. OrmaJever - 30 Января, 2014 - 22:05:56 - перейти к сообщению
Kenshin пишет:
Database класс отвечает за подключение к базе данных...

Тоже самое делает класс стандартный класс mysqli. Вот здесь хорошее описание класса и его методов с примерами.
12. caballero - 30 Января, 2014 - 22:38:24 - перейти к сообщению
Цитата:
я только учусь, вот и иногда недопонимаю всей сути проблемы и как её решить

тогда зачем берешь высосаные из пальца задачи. какое отношение твой класс имеет к MVC
13. Kenshin - 30 Января, 2014 - 23:01:49 - перейти к сообщению
caballero пишет:
Цитата:
я только учусь, вот и иногда недопонимаю всей сути проблемы и как её решить

тогда зачем берешь высосаные из пальца задачи. какое отношение твой класс имеет к MVC


Это не я сам себе придумал задачу, а получил такое практическое задание...
14. OrmaJever - 30 Января, 2014 - 23:04:51 - перейти к сообщению
Ладно, не будем вдаваться в подробности, но либо задание было глупое, либо вы его не так поняли, но скажу вам что ваш класс Database не нужен. В предыдущем посте я забыл ссылку вставить, вот она http://www.php.net/manual/ru/book.mysqli.php , прочитайте как работать с этим классом и за что отвечают какие методы (там не сложно), и используйте его.
15. Kenshin - 31 Января, 2014 - 11:23:51 - перейти к сообщению
[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 в другом классе..

 

Powered by ExBB FM 1.0 RC1