Чат Telegram
Группа ВКонтакте
Новый комментарий


rusgil 25.07.2018 в 21:39

Каждый раз при обращении к БД устанавливается кодировка:

$this->pdo->exec('SET NAMES UTF8');

Зачем это нужно? Если таблицы в БД уже в UTF-8. Или это проверка на случай, если таблицы в другой кодировке? Поясните, пожалуйста, подробнее про кодировки и зачем это делается.
Спасибо.

ivashkevich 26.07.2018 в 06:16

Это задаётся кодировка не для самой базы данных, а для соединения, в рамках которого мы будем с базой данных работать. В зависимости от ОС, на которой запущен сервер и дополнительной конфигурации, эта кодировка может отличаться. Нам важно чтобы наш клиент работал с базой в той же кодировке, что и сама база. Иначе мы в результате запросов будем получать кракозябры.

ArtemijeKA 25.10.2018 в 07:21

Спасибо.

ArtemijeKA 25.10.2018 в 07:22

У меня такой вопрос:
Почему мы используем fetchAll который выводит и индексы и ключи?
Не лучше ли доставать либо только ключи либо только индексы?

ivashkevich 26.10.2018 в 08:48

Лучше) Можете сюда написать, как Вы улучшили.

virtual2018 26.12.2018 в 12:46

С fetchAll проблема может возникнуть только на больших объемах данных возвращаемых из запроса в БД. Зато, при передаче в шаблон, эта функция становится просто незаменимой, позволяя не писать циклы вручную, и тем самым сократить количество кода.

Todd 08.11.2018 в 23:47

http://prntscr.com/lg1k1z тут наверно символ ? лишний

ivashkevich 08.11.2018 в 23:48

Нет, это значит либо массив может вернуться, либо null.

Todd 09.11.2018 в 01:06

странно, почему то у меня ругается, говорит синтаксическая ошибка (Parse error: syntax error, unexpected '?' in C:\OpenServer\domains\test\app\Services\Db.php on line 24)

ivashkevich 09.11.2018 в 09:03

PHP какая версия?

Todd 10.11.2018 в 02:30

виноват, версия была 7, надо было повыше поставить , спасибо)

ivashkevich 12.11.2018 в 01:49

Не за что)

zenap@inbox.ru 30.01.2019 в 20:40

Добрый день. Можно, на ваш взгляд, как то это оптимизировать или это имеет право на жизнь.

public function query(string $sql/*, $params = []*/): ?array
{
    $sth = ibase_query($this->pdo, $sql/*, $params*/);
    $result = ibase_query($this->pdo, $sql/*, $params*/);
    //$result = $sth->execute($params);

    if (false === $result) {
        return null;
    }

    while ($row = ibase_fetch_object($sth)){
    $resar[] = $row;
    $countar = count($resar);
    $ar = $resar[$countar - 1] -> TEXT;
    $blinfo = ibase_blob_info($ar);
    $blob = ibase_blob_open($ar);
    $bltext = ibase_blob_get($blob, $blinfo[0]);
    $resar[$countar - 1] -> TEXT = $bltext;
    $resar[$countar - 1] = (array)$resar[$countar - 1];

    }
ivashkevich 01.02.2019 в 23:48

Выглядит сложновато, рекомендую ознакомиться с другими решениями в комментах.

zenap@inbox.ru 02.02.2019 в 21:22

по firebird нет вроде вариантов....

ivashkevich 03.02.2019 в 23:46

К сожалению, не смогу Вас проконсультировать по поводу этого решения, не работал с этой базой.

excent63 09.03.2019 в 17:30

Можно узнать, для чего существуют такие комментарии?

/** @var Db */

Я где то возможно что то упустил, но погуглив не совсем понимаю для чего они.

ivashkevich 09.03.2019 в 19:40

Это используется затем IDEшкой - она знает что это за тип лежит в этом свойстве и даёт подсказки по тому, какие у него есть методы и свойства. Называется это phpdoc.

excent63 09.03.2019 в 19:44

Вот теперь понял) спасибо!

Metey 20.07.2019 в 17:34

Тема а из-за чего может быть такое непринятие? вот этой штуки : ?array PHP 7.0 стоит
текст ссылки наверное нужно синтаксический анализ PHP в редакторе проставить на 7.2 ?

ivashkevich 21.07.2019 в 05:19

Да, и в редакторе, и на сервере

Metey 20.07.2019 в 17:53

Как сделать чтоб после VAR_DUMP у меня выводилось так же ровно списком как у тебя ?

у меня почему-то выводится все в куче вот так :

array(2) { [0]=> array(10) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["author_id"]=> string(1) "1" [1]=> string(1) "1" ["name"]=> string(48) "Статья о том, как я погулял" [2]=> string(48) "Статья о том, как я погулял" ["text"]=> string(66) "Шёл я значит по тротуару, как вдруг..." [3]=> string(66) "Шёл я значит по тротуару, как вдруг..." ["created_at"]=> string(19) "2019-07-20 17:26:27" [4]=> string(19) "2019-07-20 17:26:27" } [1]=> array(10) { ["id"]=> string(1) "2" [0]=> string(1) "2" ["author_id"]=> string(1) "1" [1]=> string(1) "1" ["name"]=> string(22) "Пост о жизни" [2]=> string(22) "Пост о жизни" ["text"]=> string(109) "Сидел я тут на кухне с друганом и тут он задал такой вопрос..." [3]=> string(109) "Сидел я тут на кухне с друганом и тут он задал такой вопрос..." ["created_at"]=> string(19) "2019-07-20 17:26:27" [4]=> string(19) "2019-07-20 17:26:27" } }

ivashkevich 21.07.2019 в 05:20

Включить xdebug

Egleman 16.08.2019 в 14:00

Можно написать функцию, чтобы не включать xdebug
код функции:

function vardump($var) {
  echo '<pre>';
  var_dump($var);
  echo '</pre>';
}

Только теперь используй команду vardump, а не var_dump

prognoz 21.08.2019 в 00:37

Вопросы:
1) Файл Db.php
Почему перед array знак вопроса?

public function query(string $sql, $params = []) : ?array

2) Файл MainController.php
Эти комментарии создаются автоматом или нет? /* @var Db /
Как их делать?

3) Почему тут в запросе пишутся `` и ;

$articles = $this->db->query('SELECT * FROM `articles`;');

Вроде бы раньше просто писали:

'SELECT * FROM articles';
ivashkevich 22.08.2019 в 06:51
  1. Потому что функция помимо массива может вернуть null.
  2. Нет, они пишутся от руки. Почитайте про PHPDoc
  3. Можно и так и так, но правильнее все же окружать имя таблицы кавычками.
vtolstov 23.09.2019 в 12:25

"Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in ..." - ошибка для unix систем. Кто на убунту/маке и сервер запущен непосредственно самой системой без XAMPP и других помощников, делаем следующее:

в командной строке: mysql -uroot -p
далее: show variables like '%sock%';
копируем строку "/tmp/mysql.sock" (путь может быть другим. в конце обязательно mysql.sock)

получаем путь до php.ini в командной строке: php --ini
Идем к файлу, открываем и в строке pdo_mysql.default_socket="вставляем путь"

перезапускаем apache. (sudo apachectl restart)

в Db.php

$this->pdo = new \PDO(
                'mysql:host=' . $dbOptions['host'] . ';dbname=' . $dbOptions['dbname'] . ';unix_socket=' . $dbOptions['unix_socket'],
                $dbOptions['user'],
                $dbOptions['password']
                );

в settings.php

return [
    'db' => [
        'host' => 'localhost',
        'dbname' => 'my_project',
        'user' => 'root',
        'password' => '',
        'unix_socket' => '/tmp/mysql.sock', //здесь прописать свой путь
    ]
];
ivashkevich 23.09.2019 в 13:35

Отличный совет!

Логические задачи с собеседований