PHP -> подстановка значений массива

iCospi
На сайте с 27.09.2011
Offline
97
589

Добрый день. Знающие люди в php подскажите по изменению скрипта для редиректа.

Есть скрипт, который редиректит в зависимости от поступивших к нему данных по запросу. Обращаюсь к нему в виде site.ru/goto.php?n=5 или любое число, указанное в файле links.txt.

<?
header("HTTP/1.1 302 Moved Permanently");
$n=$_POST['n'];

if ($n=="") $n=$_GET[n];
if ($n=="") $n=0;

$ini='links.txt';

$text=file($ini);

$eer=explode(":::", $text[$n]); // Я так понимаю вот здесь explode разбивает на массив файл и эти числа используются в $n как ссылку на необходимый индекс массива. Но как убрать привязку к цифрам, не пойму...
header("Location:".$eer[1]."");
exit();
?>

Содержимое файла links.txt:

0:::http://google.ru/
1:::http://yandex.ru
3:::http://mail.ru

Суть в том, что я хочу передавать значения в скрипт не цифрой, а словами. К примеру site.ru/goto.php?n=vkontakte и правка в файле с ссылками на такую конструкцию:

vkontakte:::http://vk.com

не решает проблему. Подскажите, в какую сторону посмотреть для решения задачи. Всем заранее спасибо за ответы!

Удобная проверка позиций (http://allpositions.ru/redirect/8497) | Быстрая покупка уник контента (http://advego.ru/62bgjaNHEc)
Joker-jar
На сайте с 26.08.2010
Offline
154
#1

Обращение происходит в данном скрипте тупо по номеру строки, параметр не используется. Оптимальный вариант - хранить ссылки в виде ассоциативного массива PHP.

В
На сайте с 04.07.2017
Offline
23
#2
iCospi:

$ini='links.txt';
$text=file($ini);

У вас в переменной $text - массив по строкам файла (подставил желаемые вами значения)


Array
(
[0] => google:::http://google.ru/

[1] => yandex:::http://yandex.ru

[2] => mail:::http://mail.ru
)

Соответственно, $text[$n] - это будет полная строка, например, "yandex:::http://yandex.ru"

И это только если в $n будет число, индекс элемента.

Получается, до изменений у вас тоже неправильно работало..

Т.е. вам придется обходить весь массив $text и делать explode для каждого элемента и если там нулевой элемент будет равен $n - то уже брать значение.

Вообще, не оч. оптимально. Хранили бы в json, например

Если в вашей реализации, то вот:


<?php

$n=$_POST['n'];

if ($n=="") $n=$_GET[n];
if ($n=="") $n=0;

$ini = 'links.txt';

$text = file($ini);
foreach ($text as $line) {
$ar = explode(':::',$line);
if ($ar[0] == $n) {
header("HTTP/1.1 302 Moved Permanently");
header("Location:".$ar[1]."");
exit;
}
}

?>
LEOnidUKG
На сайте с 25.11.2006
Online
1723
#3

Да, в файле по сути первая цифра вообще ничего не значит и никому не нужна.

Как описали выше, там берётся номер строки, а не цифра перед значением.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
S
На сайте с 13.10.2014
Offline
171
#4

если этот файл нигде не используется, то можно сделать его вида


yandex=yandex.ru
google=google.com
mail=mail.ru

потом подправить код

<?
header("HTTP/1.1 302 Moved Permanently");

$inifile = 'links.txt';
$n='yandex';

if (!empty($_POST['n'])) {
$n=$_POST['n'];
} elseif (!empty($_GET['n'])) {
$n=$_GET['n'];
}

$items=parse_ini_file ($inifile);
header("Location:".$items[$n]."");
exit();
?>

писал на глаз. Надо потестить

---------- Добавлено 21.09.2017 в 15:56 ----------

после этого скрипт будет понимать значения вида site.com/?n=mail

---------- Добавлено 21.09.2017 в 16:33 ----------

апд

А если используется еще где-то, то можно поступить несколько ректально, но работать будет

надо заменить

$items=parse_ini_file ($inifile);

на

$items = parse_ini_string (str_replace(':::','=',file_get_contents($inifile)));

S
На сайте с 30.09.2016
Offline
469
#5

$n=$_REQUEST['n'];

if ($data = fopen('links.txt', 'rb'))
{
while (!feof($data)) {
$arr = explode (':::', fgets($data));
$links[$arr[0]] = $arr[1];
}
}
header("Location:".$links[$n]);
exit();
Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий