Выполнение 2 скриптов на основе разных переменных

У меня есть база данных Sql, в которой есть таблица, содержащая: электронная почта, компания, имя. Когда я делаю запрос в этой базе данных и сравниваю адреса электронной почты, я также получаю trim($row['company']) и trim($row['name']), так что компания и имя человека, связанного с этим адресом электронной почты, также снижаются.

Моя проблема заключается в следующем: я использую require_once на основе trim($row['company']) и trim($row['name']), связанных с адресом электронной почты. Бывший.

require_once "/var/www/vhosts/default/htdocs/" . trim($row['company']) . "/Users/" . trim($row['name']) . "/example.php";

Таким образом, используя приведенный выше пример, сценарий затем указывает на сценарий example.php, расположенный в каталоге, используя переменные компании и имени, которые он получил из базы данных на основе электронной почты.

Если у меня есть 2 электронных письма, каждое из которых принадлежит одной и той же компании, поэтому trim($row['company']) останется прежним, но 2 электронных письма назначены разным пользователям, поэтому trim($row['name']) будет будь другим. Есть ли способ, которым, когда я использую require_once, я могу выполнить оба сценария example.php в обоих каталогах? Спасибо!


person John    schedule 04.05.2011    source источник


Ответы (3)


Не используйте require_once, а только require (или включайте, если вам так удобнее).

person elvenbyte    schedule 04.05.2011
comment
Вы должны оправдать это предложение, потому что оно не добавляет никакой ценности, если просто сказать: сделай Х. - person Janis Veinbergs; 04.05.2011

Это выглядит небезопасно

Это выглядит небезопасно, если вы не выполняете надлежащее экранирование, так как пользователь может ввести произвольные символы и повредить ваш скрипт. (т.е. привести к другому сценарию, например, при вводе имени «../AnotherUser»)

Ответ

Но да, вы можете включить все сценарии для конкретной компании, используя glob для перечислить все каталоги в определенном каталоге:

foreach(glob("/var/www/vhosts/default/htdocs/" . trim($row['company']) . "/Users/*", GLOB_ONLYDIR) as $userDir) {
    require_once($userDir."/example.php");
}
person Janis Veinbergs    schedule 04.05.2011
comment
Пользователь не может ввести другое имя пользователя. Эти данные сохраняются в базе данных, когда они регистрируются, поэтому, как только они регистрируются со своим адресом электронной почты, именем и компанией, они не могут попасть в другой каталог пользователя. - person John; 04.05.2011
comment
У меня вот что. У меня есть скрипт, который проверяет мой почтовый ящик на наличие непрочитанных писем. Если есть непрочитанные электронные письма, он проверит адрес электронной почты, с которого они пришли (будут приходить от разных людей, разных компаний и т. д.), а затем возьмет вложение из этого электронного письма и поместит его в свой каталог на основе на название компании и имя пользователя, связанное с этим адресом электронной почты в базе данных. Если у меня есть 2 непрочитанных письма от 2 разных пользователей в одной компании, как мне выполнить оба сценария example.php? - person John; 04.05.2011
comment
Если вы не проверяете значение, которое хранится в базе данных, тогда ЕСТЬ проблема с безопасностью. И почему вы не можете выполнить свой скрипт один раз для каждого непрочитанного письма? - person Janis Veinbergs; 04.05.2011

Для этого вам нужно получить более 1 строки из вашей базы данных. Таким образом, у вас будет массив массивов в качестве результата. Например:

$result = array(
   0 => array('email' => '[email protected]', 'name' => 'Alex', 'company' => 'ABC'),
   1 => array('email' => '[email protected]', 'name' => 'Beth', 'company' => 'XYZ')
);

Как только вы получите такие данные, вы должны использовать следующий код для запуска скрипта для каждого из них:

foreach ($result as $row)
{
   require('/var/www/vhosts/default/htdocs/' . trim($row['company']) . '/Users/' . trim($row['name']) . '/example.php');
}

Что касается того, как получить несколько строк для всех электронных писем из вашей базы данных, это зависит от вашего кода БД, поэтому я не могу помочь, не видя, что вы используете.

person Tank-n-Spank    schedule 04.05.2011