Задать вопрос
@DiaTM

Я новичок, объясните правильно ли я использую pdo и обрабатываю ошибки?

Доброго времени суток коллеги разработчики. Раньше использовал mysql потом перешёл на mysqli, когда узнал что в php 7 mysqli убрали пришлось разбираться с pdo

Что будет лучше?
<?php
	define('HOST_DB', 'localhost');
	define('USER_DB', 'User');
	define('PASS_DB', 'pass');
	define('NAME_DB', 'db');


define('OPTIONS_DB', 'mysql:host=localhost; dbname=name_db; charset=utf8');
	define('USER_DB', 'User');
	define('PASS_DB', 'pass');


<?php
	define('HOST_DB', 'localhost');
	define('USER_DB', 'User');
	define('PASS_DB', 'pass');
	define('NAME_DB', 'db');
        define('CHARSET_DB', 'utf8');


<?php
	class Database{
		public $db;
		public function __construct($host_db, $user_db, $pass_db, $name_db){
                        //Правильно ли передавать параметры констант в переменных?
			try{
				$this -> db = new PDO("mysql:host=$host_db; dbname=$name_db; charset=utf8", $user_db, $pass_db);
			}
			catch(PDOException $error){
                                  //Запись ошибок в log
				exit('Не удалось подключиться к базе данных!');
			}
			return $this -> db;
		}
		public function get_all_db(){
			$sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles`";
			$result = $this -> db -> query($sql);
			if(!$result){
				return FALSE;
			}
			for($i = 0; $i < count($result); $i++){ // Возвращает 1 пробовал mysql_num_rows норм отрабатывала //$result -> rowCount(); возвращает правильно 12
				$row[] = $result -> fetchAll(PDO::FETCH_ASSOC);
			}
			return $row;
		}
		public function get_one_db(){
			
		}
	}


но создает дополнительный многомерный массив(

$result -> rowCount()

if(!$result){
				return FALSE;
			}
			for($i = 0; $i < $result -> rowCount(); $i++){
				$row[] = $result -> fetchAll(PDO::FETCH_ASSOC);
			}
			return $row;
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [articles_id] => 1
                    [title] => Как правильно использовать теги div, section и article.
                    [keywords] => 
                    [description] => 
                )

            [1] => Array
                (
                    [articles_id] => 2
                    [title] => Валидность HTML-кода
                    [keywords] => 
                    [description] => 
                )

            [2] => Array
                (
                    [articles_id] => 3
                    [title] => HTML 5 Что нового?
                    [keywords] => 
                    [description] => 
                )

            [3] => Array
                (
                    [articles_id] => 4
                    [title] => CSS
                    [keywords] => 
                    [description] => 
                )

            [4] => Array
                (
                    [articles_id] => 5
                    [title] => Сокрытие элементов на CSS.
                    [keywords] => 
                    [description] => 
                )

            [5] => Array
                (
                    [articles_id] => 6
                    [title] => JavaScript
                    [keywords] => 
                    [description] => 
                )

            [6] => Array
                (
                    [articles_id] => 7
                    [title] => Как визуализировать графики и сделать их интерактивными на JavaScript.
                    [keywords] => 
                    [description] => 
                )

            [7] => Array
                (
                    [articles_id] => 8
                    [title] => PHP
                    [keywords] => 
                    [description] => 
                )

            [8] => Array
                (
                    [articles_id] => 9
                    [title] => Что нового в PHP7.1: генерация случайных чисел.
                    [keywords] => 
                    [description] => 
                )

            [9] => Array
                (
                    [articles_id] => 10
                    [title] => Социальная сеть на PHP: вывод домашней страницы.
                    [keywords] => 
                    [description] => 
                )

            [10] => Array
                (
                    [articles_id] => 11
                    [title] => jQuery
                    [keywords] => 
                    [description] => 
                )

            [11] => Array
                (
                    [articles_id] => 12
                    [title] => Ajax запросы с помощью методов $.post() и $.get().
                    [keywords] => 
                    [description] => 
                )

        )

    [1] => Array
        (
        )

    [2] => Array
        (
        )

    [3] => Array
        (
        )

    [4] => Array
        (
        )

    [5] => Array
        (
        )

    [6] => Array
        (
        )

    [7] => Array
        (
        )

    [8] => Array
        (
        )

    [9] => Array
        (
        )

    [10] => Array
        (
        )

    [11] => Array
        (
        )

)


Правильно ли если бросать в параметры следующее?

<?php
	$host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $charset = 'utf8';

    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $pdo = new PDO($dsn, $user, $pass, $opt);

	try {
    $dbh = new PDO($dsn, $user, $password);
	} catch (PDOException $e) {
		die('Подключение не удалось: ' . $e->getMessage());
	}
	
	$stmt = $pdo->query('SELECT name FROM users');
	while ($row = $stmt->fetch())
	{
		echo $row['name'] . "\n";
	}
  • Вопрос задан
  • 874 просмотра
Подписаться 1 Оценить 2 комментария
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Нет, здесь все неправильно.

Если коротко, то

1. Класс Database выкинуть на помойку.
2. Все exit() в коде выкинуть на помойку
3. Все try..catch туда же

В итоге у нас останется

class article {
    public function __construct($pdo)
        $this->pdo = $pdo;
    }
    public function get_all_db() {
        $sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles`";
        return $this->pdo->query($sql)->fetchAll();
    }
    public function get_one_db($id){
        $sql = "SELECT `articles_id`, `title`, `keywords`, `description` FROM `articles` WHERE articles_id = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$id]);
        return $stmt->fetch();
    }
}


Все удобно, компактно и безопасно.
Кода получается меньше чем в mysqli и mysql вместе взятых.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы