Здравствуйте, ранее обладал php скриптом, который работал, да и сейчас работает конечно, но только на версии php 5.4. Хостинги теперь не держат такую версию, а те, которые держат не подходят. Коротко о скрипте, заходим на сайт site.ru/администратор и у нас открывалась страница admin.tpl (ключ администратор хранился в mysql) если запрос был из базы, то открывалась template.tpl (индексная страница), если запроса не был в базе, то открывалась 404.tpl. Погуглив понял, что всё изменилось, а именно mysql теперь mysqli , но что-то не помогло, у меня открывается 404.tpl, хотя соединение с базой устанавливается. Листинг php 5.4: PHP: <?php error_reporting(E_ALL); ini_set('display_errors', 1); //подключаем файл базы данных require_once('mysqli.inc'); $uploaddir = '/home/site.ru/public_html/'; // Назначаем модуль и действие по умолчанию. $module = 'index'; $action = 'index'; // Массив параметров из URI запроса. $params = array(); // Если запрошен любой URI, отличный от корня сайта. if ($_SERVER['REQUEST_URI'] != '/') { try { // Для того, что бы через виртуальные адреса можно было также передавать параметры // через QUERY_STRING (т.е. через "знак вопроса" - ?param=value), // необходимо получить компонент пути - path без QUERY_STRING. // Данные, переданные через QUERY_STRING, также как и раньше будут содержаться в // суперглобальных массивах $_GET и $_REQUEST. $url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $url_path = urldecode ($url_path); // Разбиваем виртуальный URL по символу "/" $uri_parts = explode('-', trim($url_path, ' -')); $gorod = ''; $search = ''; $title = ''; foreach ($uri_parts as $search) { if ($gorod != '') {$gorod .= $search;} else if ($search != 'в') {$title .= $search.' ';} if ($search == 'в') { $gorod .= $search.' '; } } $title = str_replace('/', '', $title); $search = $uri_parts[count($uri_parts)-1]; $sql = "SELECT * FROM towns where town = '".$search."'"; $result = mysql_query($sql); $row = mysql_fetch_assoc($result); if ($row['town']) { $title = str_replace($search, '', $title); $gorod=$search;} // Если количество частей не кратно 2, значит, в URL присутствует ошибка и такой URL // обрабатывать не нужно - кидаем исключение, что бы назначить в блоке catch модуль и действие, $sql = "SELECT * FROM keywords where keyword = '".$title."'"; $result = mysql_query($sql); if (!$result) { $message = 'Неверный запрос: ' . mysql_error() . "\n"; $message .= 'Запрос целиком: ' . $sql; die($message); } $row = mysql_fetch_assoc($result); if (!$row['keyword']) { throw new Exception(); } //рендерим страницу if ($title=='администратор ') {require_once('admin.tpl');} else {require_once('template.tpl');} } catch (Exception $e) { require_once('404.tpl'); } } в mysqli.inc соответственно было: PHP: <?php $db = mysql_connect('localhost', 'site_user', 'password'); mysql_set_charset('utf8',$db); mysql_select_db('base_bd',$db); /* check connection */ ?> и вот к чему пришел сейчас методом тыка, но чего то не хватает (мозгов точно не хватает, поэтому пишу вам) PHP: <?php error_reporting(E_ALL); ini_set('display_errors', 1); $servername = "localhost"; $username = "user"; $password = "password"; $base = "base_bd"; //подключаем файл базы данных $con = new mysqli($servername, $username, $password, $base); $uploaddir = '/home/site.ru/public_html'; // Назначаем модуль и действие по умолчанию. $module = 'index'; $action = 'index'; // Массив параметров из URI запроса. $params = array(); // Если запрошен любой URI, отличный от корня сайта. if ($_SERVER['REQUEST_URI'] != '/') { try { // Для того, что бы через виртуальные адреса можно было также передавать параметры // через QUERY_STRING (т.е. через "знак вопроса" - ?param=value), // необходимо получить компонент пути - path без QUERY_STRING. // Данные, переданные через QUERY_STRING, также как и раньше будут содержаться в // суперглобальных массивах $_GET и $_REQUEST. $url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $url_path = urldecode ($url_path); // Разбиваем виртуальный URL по символу "/" $uri_parts = explode('-', trim($url_path, ' -')); $gorod = ''; $search = ''; $title = ''; foreach ($uri_parts as $search) { if ($gorod != '') {$gorod .= $search;} else if ($search != 'в') {$title .= $search.' ';} if ($search == 'в') { $gorod .= $search.' '; } } $title = str_replace('/', '', $title); $search = $uri_parts[count($uri_parts)-1]; $result = mysqli_query( "SELECT * FROM towns where town = '".$search."'"); $row = mysqli_fetch_assoc($result); if ($row['town']) { $title = str_replace($search, '', $title); $gorod=$search;} // Если количество частей не кратно 2, значит, в URL присутствует ошибка и такой URL // обрабатывать не нужно - кидаем исключение, что бы назначить в блоке catch модуль и действие, $sql = "SELECT * FROM keywords where keyword = '".$title."'"; $result = mysqli_query($sql); if (!$result) { $message = 'Неверный запрос: ' . mysqli_error() . "\n"; $message .= 'Запрос целиком: ' . $sql; die($message); } $row = mysqli_fetch_assoc($result); if (!$row['keyword']) { throw new Exception(); } //рендерим страницу if ($title=='администратор ') {require_once('admin.tpl');} else {require_once('template.tpl');} } catch (Exception $e) { require_once('404.tpl'); } } Помогите сделать скрипт рабочий!!!
прочитал вроде на пхп.нет что теперь меняется по другому подключение к бд, как написать то надо, что заработало?
Во-во. Если бы было наоборот, еще можно было понять. Есть похожий фронт – G-Drive. Только в нем кириллица в адресах «из коробки» не поддерживается. Можно добавить путем расширения множества допустимых символов пути символом % и хранения слагов в БД в URL-кодировке. Также можно использовать слаги городов на латинице (в сети есть такие таблицы, у нас тоже есть). Скрипт различает слаг и тайтл, т.е. можно использовать слаги на латинице и тайтлы на кириллице. --- Добавлено --- Естественно, работает и на семерке, и на восьмерке. Кстати, в 5.4 расширение MySQLi уже было основным.
P.S. Второй запрос (к keywords) нужно будет вынести в контроллер или подправить сам фронт (ф-цию формирования имени таблицы объектов), т.к. «из коробки» второй запрос автоматом выполняется к таблице объектов, имя которой связано со слагом категории (города).
по вашей ссылке никаких фронтов нет, гугл тоже не дал результатов, даже ссылки на гитхаб, чтобы скачать
исправил 11 строку на $mysqli = mysqli_connect($servername, $username, $password, $base); и всё равно выдает ошибки.... Warning: mysqli_query() expects at least 2 parameters, 1 given in /home//site.ru/public_html/index.php on line 47 Warning: mysqli_error() expects exactly 1 parameter, 0 given in /home//site.ru/public_html/index.php on line 49 Неверный запрос: Запрос целиком: SELECT * FROM keywords where keyword = 'администратор '
Ну переведите ошибки, у mysqli_query() обязательный параметр - подключение к базе, в Вашем случае $mysqli.
Все там есть. См. комменты. Есть даже вариант для студентов за 10 руб., хотя это не про вас, судя по показанным выше ошибкам и неспособности их решить. Но ОК, нет так нет --- Добавлено --- Когда ошибки перевода вам исправят, попросите почистить др. элементарные ошибки вроде SQL-инъекций
спасибо и правда помогло, подставить $mysqli перед запросом. Теперь почти всё работает, кроме русских букв, с латиницей отлично всё открывает template.tpl но если в запросе поставить тот же запрос "администратор" то он не обрабывается и открывается 404.tpl если любой другой запрос с русскими символами, то тоже 404 tpl....куда теперь копать?
Всё разобрался, строка mysqli_set_charset($mysqli, "utf8mb4"); помогла, работает через жопу, но работает) --- Добавлено --- всем спасибо