Здравствуйте! Работал на PHP 5.4 файл, который вытаскивал последние 10 новостей из таблицы базы данных в RSS-файл. И при переходе на версию PHP 7.3 этот файл перестал функциклировать. Код не сложный для меня был на старой версии, но вот не новой весии PHP не могу сладить. Разобрался, что теперь нужно коннектиться через $connection = mysqli_connect( ) Но застрял на mysqli_query, и как заменить все остальное теперь не представляю. Уже запутался, прошу помочь. Вот сам код: PHP: $feedPath = "news.xml"; $rssTitle = " "; // The title of your rss feed. $rssLink = " "; // A link to your website. $rssDesc = " "; // A description of your feed. // MYSQL database connection settings $dbServer = " "; // Server for mysql database (usually localhost). $dbName = " "; // Name of the database. $dbUser = " "; // Username for the database. $dbPass = " "; // Password for the database. // Table settings $tableName = " "; // The name of the table to feed. $tableKey = " "; // The name of the field that holds primary keys $tableTitle = " "; // The name of the field that holds the title $tableDate = " "; // The name of the field that holds the formatted date $tableDesc = " "; // The name of the field that holds the description $tableText = " "; // The name of the field that holds the description $tablePicture = " "; // Изображение для новости // Создание стартового блока //Дата в формате RFC 2822 http://www.faqs.org/rfcs/rfc2822.html $buildDate = date("r"); $startBlock = '<?xml version="1.0" encoding="utf-8" ?>'; $startBlock .= '<description>' . $rssDesc . '</description>'; $startBlock .= '<lastBuildDate>' . $buildDate . '</lastBuildDate>'; // Создание конечного блока $endBlock .= '</rss>'; // Коннект к базе данных mysql_connect($dbServer,$dbUser,$dbPass); mysql_selectdb($dbName); mysql_set_charset( 'utf8' ); // Последние 10 новостей $sql = "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " DESC LIMIT 10"; $result = mysql_query($sql); $num = mysql_num_rows($result); // Cycle through last 10 news articles and add them to the item block array. $itemBlock = array(""); for($i=0; $i<$num; $i++) { $newsID = mysql_result($result, $i, $tableKey); $newsTitle = mysql_result($result, $i, $tableTitle); $newsDate = mysql_result($result, $i, $tableDate); $newsDesc = mysql_result($result, $i, $tableDesc); $newsText = mysql_result($result, $i, $tableText); $newsDesc = htmlspecialchars($newsDesc); $newsDate = date("r"); //Создание переменных $title = '<title>' . $newsTitle . '</title>'; $desc = '<description>' . $newsDesc . '</description>'; $text = '<full-text>' . $newsText . '</full-text>'; $link = '<link>' . $newsLink . ' ' . $newsID . '</link>'; $pubDate = '<pubDate>' . $newsDate . '</pubDate>'; //Вывод в файл array_push($itemBlock, '<item>'); array_push($itemBlock, $title); array_push($itemBlock, $link); array_push($itemBlock, $desc); array_push($itemBlock, $pubDate); array_push($itemBlock, $text); array_push($itemBlock, '</item>'); } // Запись результата в файл $file = $feedPath; $file = fopen($file, "w"); fwrite($file, $startBlock); $length = count($itemBlock); for($i = 0; $i < $length; $i++) { fwrite($file, $itemBlock[$i]); } fwrite($file, $endBlock); fclose($file);
Начал с этого: PHP: $connection = mysqli_connect($dbServer, $dbName, $dbPass, $dbUser); $sql = "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " DESC LIMIT 10"; $result = mysqli_query($sql); чем далее заменить mysql_result и как понять правильно ли делаю?
Есть такое гениальное изобретение человечества, называется документация https://php.net/mysqli_query --- Добавлено --- https://www.php.net/mysqli_connect - параметры у mysqli_connect в другом порядке. А вообще, 7.3 уже тоже старая. 8.1 на носу
За ссылки конечно спасибо. Что-то я уже сам нашел. Вот только слишком сложно для меня это становится. Да и рубрику нашел "Сделайте за меня" Я конечно пытаюсь сам разобраться, но видимо последствия этой КОВИДлы долго будут сказываться.
Вот что получилось, но не работает PHP: // Connect to the database. $connection = mysqli_connect($dbServer, $dbName, $dbPass, $dbUser); $connect->query("SET NAMES 'utf8' "); // Берем последние 10 новостей. $result = mysqli_query($connect, "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " DESC LIMIT 10"); $num = mysqli_num_rows($result); // Cycle through last 10 news articles and add them to the item block array. $itemBlock = array(""); for($i=0; $i<$num; $i++) { $newsID = mysqli_result($result, $i, $tableKey); $newsTitle = mysqli_result($result, $i, $tableTitle); $newsDate = mysqli_result($result, $i, $tableDate); $newsDesc = mysqli_result($result, $i, $tableDesc); $newsText = mysqli_result($result, $i, $tableText); $newsLink = $rssLink; //Вывод в файл array_push($itemBlock, '<item>'); array_push($itemBlock, $title); array_push($itemBlock, $link); array_push($itemBlock, $desc); array_push($itemBlock, $pubDate); array_push($itemBlock, $text); array_push($itemBlock, '</item>'); }
Нет. Сейчас посмотрел. Лучше бы у моего файла коннекты к базе переделать, там много всего было сделано и для турбо и прочее.
Смотрю код: $con=mysqli_connect("example.com","alex","qwerty"); А это точно будет на PHP 7.3 работать?
@КТ815 Я уже тебе намекнул: Код (Text): mysqli_connect( string $hostname = ini_get("mysqli.default_host"), string $username = ini_get("mysqli.default_user"), string $password = ini_get("mysqli.default_pw"), string $database = "", int $port = ini_get("mysqli.default_port"), string $socket = ini_get("mysqli.default_socket") ): mysqli|false Вот в таком порядке передаются в функцию mysqli_connect параметры: хост, имя пользователя, пароль, имя базы данных, порт (если нестандартный), сокет (если не стандартный). Ты после этого написал код, в котором передаётся хост, имя базы данных, пароль, имя пользователя. И удивляешься что не работает. Дальше, откуда ты выудил функцию mysqli_result? Такой функции нету. Да, ты разместил в "сделайте за меня", и я мог проигнорить эту тему, что и буду, в принципе, делать, поскольку этот раздел - это по описанию, помойка для тем тех людей, которые не хотят учиться. Но я даю очень конкретные подсказки, причём тут корона? У нас пол офиса переболело, и нормально работает. --- Добавлено --- Это не настолько неочевидные вещи, чтоб корона повлияла. Ты же буквы не забыл, очевидно, от неё.
Это я перепутал когда пост писал. Вот такая конструкция вроде бы должна работать, но не работает. Что то опять не правильно. PHP: $connect = mysqli_connect($dbServer, $dbUser, $dbPass, $dbName); $sql = "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " DESC LIMIT 10"; $result = mysqli_query($sql); $num = mysqli_num_rows($result); // Cycle through last 10 news articles and add them to the item block array. $itemBlock = array(""); for($i=0; $i<$num; $i++) { $newsID = mysqli_fetch_all($result, $i, $tableKey); $newsTitle = mysqli_fetch_all($result, $i, $tableTitle); $newsDate = mysqli_fetch_all($result, $i, $tableDate); $newsDesc = mysqli_fetch_all($result, $i, $tableDesc); $newsText = mysqli_fetch_all($result, $i, $tableText); //Вывод в файл array_push($itemBlock, '<item>'); array_push($itemBlock, $title); array_push($itemBlock, $link); array_push($itemBlock, $desc); array_push($itemBlock, $pubDate); array_push($itemBlock, $text); array_push($itemBlock, '</item>'); } --- Добавлено --- Почему то mysqli_fetch_all не срабатывает, хотя по документации вроде так https://php.ru/manual/mysqli-result.fetch-all.html
Что то заработало. Вот такой код сработал. Но не извлекает сами данные. Буду дальше разбираться. Вероятно проблема с mysqli_fetch_all PHP: // Connect to the database. $connect = mysqli_connect($dbServer, $dbUser, $dbPass, $dbName); mysqli_query($connect, "SET NAMES utf8"); $sql = "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " DESC LIMIT 10"; $result = mysqli_query($connect, $sql); $num = mysqli_num_rows($result); // Cycle through last 10 news articles and add them to the item block array. $itemBlock = array(""); for($i=0; $i<$num; $i++) { $newsID = mysqli_fetch_all($result, $i, $tableKey); $newsTitle = mysqli_fetch_all($result, $i, $tableTitle); $newsDate = mysqli_fetch_all($result, $i, $tableDate); $newsDesc = mysqli_fetch_all($result, $i, $tableDesc); $newsText = mysqli_fetch_all($result, $i, $tableText); $newsLink = $rssLink; $newsDate = date("r"); //Вывод в файл array_push($itemBlock, '<item>'); array_push($itemBlock, $title); array_push($itemBlock, $link); array_push($itemBlock, $desc); array_push($itemBlock, $pubDate); array_push($itemBlock, $text); array_push($itemBlock, '</item>'); }
https://www.php.net/manual/ru/mysqli-result.fetch-all.php Сигнатура другая у функции. --- Добавлено --- Есть документация, причём даже на русском языке. Ну неужели не прочитать, что делает фунция --- Добавлено --- Какой смысл дёргать её в цикле?
Не могу подобрать какая функция может подойти для замены. Модет mysqli_fetch_field_direct — Получение метаданных конкретного поля?
@КТ815. Не нужно искать замену старым функциям. Нужно просто использовать подходящие новые. Сдвинуться от того, что тебе непременно нужно циклом фор перебирать индекс, к примеру. Или сообразить, что если mysqli_fetch_all возвращает все результаты в виде массива, можно её один раз дёрнуть перед этим циклом. --- Добавлено --- И дальше брать элементы этого массива
Вообщем одну ошибку нашел из-за чего у меня выводилось что 10 строк но нет данных. Это происходит если в запросе прописано DESC, что у меня и оставалось со старой версии. $sql = "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " DESC LIMIT 10"; Нужно писать $sql = "SELECT * FROM " . $tableName . " ORDER BY " . $tableKey . " LIMIT 10"; Как убрал - так сразу вывелись данные. Буду копать дальше.
Теперь вопрос как взять последние 10 новостей. Все работает, но только выборка происходит первых 10 новостей.
DESC - выводит "последние" записи (ASC - выводит "первые") - похоже это теперь в PHP7 не работает. Как бы отсортировать таблицу по ключу-дате, когда последняя новость будет первой в таблице?