Как получить относительный каталог, неважно, от того, где он включен в PHP?

Короткий ответ на ваш вопрос - «нет».

В строгом смысле, на уровне базы данных подготовленные операторы позволяют привязывать параметры только к битам «values» инструкции SQL.

. Один из способов думать об этом - «вещи, которые можно заменить во время выполнения инструкции без изменения ее значения». Имя (и) таблицы не является одним из этих значений времени выполнения, поскольку оно определяет правильность самого оператора SQL (то есть, какие имена столбцов являются допустимыми) и изменение его во время выполнения потенциально может изменить, является ли оператор SQL действительным.

На немного более высоком уровне даже в интерфейсах базы данных, которые эмулируют подстановку подготовленного оператора, а не фактически посылают подготовленные операторы в базу данных, такие как PDO, которые могли бы позволить вам использовать местозаполнитель в любом месте (поскольку placeholder заменяется перед отправкой в ​​базу данных в этих системах), значение заполнителя таблицы будет строкой и вложено как таковое в SQL, отправленное в базу данных, поэтому SELECT * FROM ? с mytable в качестве параметра на самом деле заканчивается (f4) в базу данных, которая является недопустимой SQL.

Лучше всего продолжать работу с

SELECT * FROM {$mytable}

, но вы абсолютно должны иметь белый список таблиц что вы сначала проверяете, если $mytable поступает с пользовательского ввода.

13
задан Community 23 May 2017 в 12:09
поделиться

2 ответа

У вас есть доступ к $ _ Server ['Script_name'] ? Если вы сделаете:

dirname($_SERVER['SCRIPT_NAME']);

должен работать. В противном случае сделайте это:

в PHP <5.3:

substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT']));

или PHP> = 5.3:

substr(__DIR__, strlen($_SERVER['DOCUMENT_ROOT']));

Вам может потребоваться RealPath () и str_replace () Все ] \ - / , чтобы сделать его полностью портативным, как это:

substr(str_replace('\\', '/', realpath(dirname(__FILE__))), strlen(str_replace('\\', '/', realpath($_SERVER['DOCUMENT_ROOT']))));
25
ответ дан 1 December 2019 в 19:23
поделиться

PHP < 5.3:

dirname(__FILE__)

PHP >= 5.3:

__DIR__

EDIT:

Вот код для получения пути входящего файла относительно пути запуска php-файла:

    $thispath = explode('\\', str_replace('/','\\', dirname(__FILE__)));
    $rootpath = explode('\\', str_replace('/','\\', dirname($_SERVER["SCRIPT_FILENAME"])));
    $relpath = array();
    $dotted = 0;
    for ($i = 0; $i < count($rootpath); $i++) {
        if ($i >= count($thispath)) {
            $dotted++;
        }
        elseif ($thispath[$i] != $rootpath[$i]) {
            $relpath[] = $thispath[$i]; 
            $dotted++;
        }
    }
    print str_repeat('../', $dotted) . implode('/', array_merge($relpath, array_slice($thispath, count($rootpath))));
9
ответ дан 1 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: