Перейти к содержимому



Не подключается к БД

#1 Kuchuluk

Kuchuluk
  • Пользователь
  • 329 сообщений
  • Репутация: 5
0

Отправлено 25 Июнь 2018 - 09:15

Здравствуйте.

Использовал простой mysql_connect запрос, все работало.

Перешел на mysqli, не подключается к базе. Такой запрос $db = mysqli_connect("localhost", "root", "", "database")

В phpinfo показывает что mysqli включен. Но делаю var_dump($db) и показывает NULL

В чем еще может быть проблема?

 

Добавлено:

сейчас заметил не работает, когда соединение с БД лежит в отдельном файле db.php . Если ложу строку $db = mysqli_connect("localhost", "root", "", "telecomloc"); в функцию, в которой делаю выборку, то есть так

function getUserByLogin($login) {
	$sql = "SELECT * FROM `users` WHERE `username` = '{$login}'";
	$db = mysqli_connect("localhost", "root", "", "database");
	
	$query = mysqli_query($db, "SELECT * FROM `users` WHERE `username` = 'myname'");
	$row = mysqli_fetch_assoc($query);
}

тогда выборка проходит.

Это что получается, что когда используется расширение mysqli, то подключение к БД и сами запросы должны лежать рядом обязательно?


 

 

Сообщение отредактировал Kuchuluk: 25 Июнь 2018 - 09:58

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Подключить несколько баз данных к одному сайту
  2. Как подключить файл PHP к MySql
  3. Настраиваем подключение к базе данных
  4. Не могу импортировать БД с локального сервера
  5. Не получается подключить бд

#2 miketomlin

miketomlin
  • Пользователь
  • 478 сообщений
  • Репутация: 101

Отправлено 25 Июнь 2018 - 12:21

Это что получается, что когда используется расширение mysqli, то подключение к БД и сами запросы должны лежать рядом обязательно?
Нет конечно. Нужно показывать код, который не работает, а не который «начинает работать».

 

Если включить Вангу, предположу, что пытаетесь использовать глоб. переменную внутри ф-ции без соотв. ссылки или без передачи через параметр ф-ции. Либо неправильно подключаете включаемый файл, например не указываете путь.

 

P.S. Нужно в обязательном порядке проверять в коде результат подключения к серверу БД и результаты запросов. При разработке также можно выводить номера/тексты ошибок, а не писать, скажем, их в лог.


P.P.S. Если не хотите использовать глоб. переменную, сделайте что-то вроде шаблона «реестр». На процедурке делается при помощи лок. стат. переменных.


  • 0

#3 fedornabilkin

fedornabilkin
  • Модератор
  • 1 111 сообщений
  • Репутация: 180

Отправлено 26 Июнь 2018 - 10:20

Классы надо использовать. Об этом ведь все постоянно пишут и говорят. Я долго время использовал вот такой. Он был выдран из DLE каким-то юным разработчиком и допилен под свои нужды. Я тоже немного допиливал.

Спойлер

 

Где-то в конфиге определяем константы DBUSER, DBPASS, DBNAME, DBHOST (есть же такой файл с настройками?). Там же, например, определяем переменную $db = new Mysql(); (Конечно же необходимо, чтобы класс Mysql был подключен загрузчиком или хардкорно через require_once). При этом соединение с БД еще не будет происходить, потому что нет нужды. А произойдет оно при первом запросе к базе. Запросы можно строить следующим образом.

// обычный запрос, возвращает ресурс
$sql = "SELECT * FROM `users` WHERE `id` = '1';";
$query = $db->query($sql);

// дальше из этого запроса можно получить данные
$user = $db->get_row($query); // $user содержит ассоциативный массив данных

// очень удобен такой вариант
$sql = "SELECT * FROM `users` WHERE `id` = '1';";
$user = $db->super_query($sql); // тот же массив, но в две строки

// список пользователей
$sql = "SELECT * FROM `users`;";
$users = $db->super_query($sql, true);

foreach($users as $row){
    echo $row['login'] . '<br>'; // login это название поля в таблице users в БД
}


Если пошариться по классу, можно увидеть, что есть возможность отслеживать количество запросов к базе, время, затраченное на каждый запрос и т.д. Если возникнет ошибка, то можно увидеть запрос, который ее возник (константа DBSHOW_ERROR должна быть установлена в true).

 

Конфиг у меня такой

$cfg['db']['host'] = "localhost";
$cfg['db']['name'] = "name";
$cfg['db']['user'] = "user";
$cfg['db']['pass'] = "pass";
$cfg['db']['charset'] = "utf8";
$cfg['db']['show_error'] = true;

Где-то в файле инициализации приложения объявляю константы

define ("DBHOST", $cfg['db']['host']); 
define ("DBNAME", $cfg['db']['name']);
define ("DBUSER", $cfg['db']['user']);
define ("DBPASS", $cfg['db']['pass']);
define ("COLLATE", $cfg['db']['charset']);
define ("DBSHOW_ERROR", $cfg['db']['show_error']);

  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.




Оформление форума – IPBSkins.ru