Prepared statement

peon

Lok'tar ogar
$this->pdo = new PDO жирное без $

Можно поступить проще:
Два варианта:
PHP:
class DB {
    public static $db;
}
DB::$db= new PDO("mysql:host=$db_host;dbname=$db_name, $db_user, $db_pass');
$stmt = DB::$db->prepare("SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?");
PHP:
function pdo() {
static $pdo;
if(empty($pdo)) $pdo = new PDO("mysql:host=DB_HOST;dbname=DB_NAME, DB_USER, DB_PASS');
return $pdo;
}

$stmt = pdo()->prepare("SELECT `mail` FROM `userdata` WHERE `username`= ? AND `password`= ?");
 

hell0w0rd

Продвинутый новичок
PHP:
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');

$pdo = new PDO("mysql:host=DB_HOST;dbname=DB_NAME", DB_USER, DB_PASS);
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known' on line 20
 

peon

Lok'tar ogar
PHP:
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PASS', '');

$pdo = new PDO("mysql:host=DB_HOST;dbname=DB_NAME", DB_USER, DB_PASS);
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known' on line 20
PHP:
$pdo = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME, DB_USER, DB_PASS);
 

peon

Lok'tar ogar
Давайте будем сразу указывать на мой касяк, а не устраивать шоу. Теперь буду запускать код прежде чем постить.
 

hell0w0rd

Продвинутый новичок
peon, да тут вообще косяк в том, что это гавнокодище и нельзя так делать.
А что если нужно несколько экземпляров PDO с разными параметрами? А что если константа не определена?
 

peon

Lok'tar ogar
Добавим еще константу или просто пропиши pgsql или что у тебя там. Не универсален для sqlite.

peon, да тут вообще косяк в том, что это гавнокодище и нельзя так делать.
А что если нужно несколько экземпляров PDO с разными параметрами? А что если константа не определена?
У тс не интерпрайз задача и так сойдет. Главное чтобы код работал.

>А что если нужно несколько экземпляров PDO с разными параметрами?
я должен об этом заботиться? я привел решение для текущей задачи.

>А что если константа не определена?
http://phpclub.ru/talk/threads/prepared-statement.77625/page-2#post-699278
 

hell0w0rd

Продвинутый новичок
Да какая вообще разница для чего это нужно? Если делать - то делать хорошо, или вообще не делать, а взять что-то готовое
 

hell0w0rd

Продвинутый новичок
peon, использование констант в создании экземпляра какого либо класса - гавнокод.
пролистай в самый первый ответ фаната - увидишь альтернативы
 

peon

Lok'tar ogar
> peon, использование констант в создании экземпляра какого либо класса - гавнокод.
впервые это слышу. аргументируй пожалуйста.

> пролистай в самый первый ответ фаната - увидишь альтернативы
там нет альтернативы для pdo
 

hell0w0rd

Продвинутый новичок
peon, константа может быть не определена, возможно вам нужно создать два экземпляра класса с разными параметрами, а константу не переопределить, и главное - зачем так делать, у вас есть аргументы функции - используйте их!
А что же это еще? Это альтернатива для PDO, эмуляция подготовленных выражений для mysql.
https://github.com/FountainDb/pdoshechka - вот мой велосипед
https://github.com/doctrine/dbal - вот очень серьезная, нагроможденная либа
и еще два десятка готовых либ, в которых большинство хотелок реализовано, протестированно - бери и используй
 

peon

Lok'tar ogar
> peon, константа может быть не определена,

те же проблему могут возникнуть и с неопределенной переменной, не?

> возможно вам нужно создать два экземпляра класса с разными параметрами, а константу не переопределить,

с точки зрения какой задачи?
если приложению требуется только одна бд, как в большинстве случаев, то и достаточно конфига в виде констант
если множество баз, то делаем конфиг в виде массива и реализуем стек подключений в том же синглтоне например

>- зачем так делать, у вас есть аргументы функции - используйте их!

константа доступна в любой области кода, что не сказать о обычных переменных
речь о какой функции? если function pdo(), то она для одной бд

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

hell0w0rd

Продвинутый новичок
peon, у меня нет задачи тебя убеждать
Сам пишешь - твой пароль к базе, юзер и название базы доступно из любой точки приложения - это по твоему нормально?
Еще какой гавнокод, у тебя была минимальная абстракция - конструктор принимал параметры для подключения, ты взял и захардкодил константы, как это еще назвать?

В общем бессмысленный диалог. На мой взгляд использование глобальных констант оправданно для передачи параметров окружения в приложение. Например DIRECTORY_SEPARATOR, хотя сейчас говорят что он и не нужен особо
В си/плюсах используют константы во время линковки, чтобы для конкретной системы использовался определенный код.
А подключение к базе - это не параметр окружения, это параметр конкретного приложения
 
Последнее редактирование:
  • Like
Реакции: peon
Сверху