Comment passer des paramètres dans un script PHP via une page Web?

139

J'appelle un script PHP chaque fois qu'une page Web se charge. Cependant, il existe un paramètre que le script PHP doit exécuter (que je passe normalement par la ligne de commande lorsque je teste le script).

Comment puis-je transmettre cet argument à chaque fois que le script est exécuté lors du chargement de la page?

pseudo
la source
1
Pouvez-vous poster votre code, s'il vous plaît?
SenorAmor
1
alors vous voulez exécuter une ligne de commande? ou un script php?
Christopher Pelayo
D'accord, merci les gars. J'ai obtenu les réponses ci-dessous: utilisez $ GET et passez-le en tant que valeur de paramètre dans l'url elle-même.
Nick

Réponses:

233

Vraisemblablement, vous passez les arguments sur la ligne de commande comme suit:

php /path/to/wwwpublic/path/to/script.php arg1 arg2

... puis y accéder dans le script ainsi:

<?php
// $argv[0] is '/path/to/wwwpublic/path/to/script.php'
$argument1 = $argv[1];
$argument2 = $argv[2];
?>

Ce que vous devez faire lorsque vous passez des arguments via HTTP (accès au script sur le Web) consiste à utiliser la chaîne de requête et à y accéder via le superglobal $ _GET:

Allez sur http://votredomaine.com/path/to/script.php?argument1=arg1&argument2=arg2

... et accès:

<?php
$argument1 = $_GET['argument1'];
$argument2 = $_GET['argument2'];
?>

Si vous voulez que le script s'exécute quel que soit l'endroit d'où vous l'appelez (ligne de commande ou depuis le navigateur), vous souhaiterez quelque chose comme ce qui suit:

EDIT: comme indiqué par Cthulhu dans les commentaires, le moyen le plus direct de tester dans quel environnement vous exécutez est d'utiliser la constante PHP_SAPI . J'ai mis à jour le code en conséquence:

<?php
if (PHP_SAPI === 'cli') {
    $argument1 = $argv[1];
    $argument2 = $argv[2];
}
else {
    $argument1 = $_GET['argument1'];
    $argument2 = $_GET['argument2'];
}
?>
Jason
la source
J'utiliserais empty($_GET). $_GETest une valeur prédéfinie, donc je suis à peu près sûr qu'elle est toujours définie, mais vide s'il n'y a pas de paramètres GET définis. empty()retourne falseles chaînes et tableaux vides.
Tim S.
Sans vraiment vérifier, je pense que ce $_GETn'est en fait pas défini si le script est appelé dans un contexte de ligne de commande. empty()le ferait rechercher des arguments de ligne de commande si le script est accédé à partir du Web sans chaîne de requête, lançant ainsi plus d'avis.
Jason
$ argv [0] n'est pas réellement arg1 dans votre premier exemple, ce serait "/path/to/wwwpublic/path/to/script.php". ( php.net/manual/en/reserved.variables.argv.php )
CasualT
3
Je me rends compte que je suis en retard pour la fête, mais la bonne façon de vérifier est PHP_SAPI === 'cli'.
Cthulhu
1
@emanueledelgrande Je ne suis pas tout à fait sûr de suivre ce que vous demandez, mais je vais essayer. .htaccessest un fichier Apache - Apache traite les requêtes entrantes avec les directives dans .htaccess, puis appelle PHP pour générer la réponse à la requête. Donc, si vous êtes dans la ligne de commande, .htaccesssera complètement ignoré. Si vous accédez à un script via le Web et que vous souhaitez ajouter de nouveaux arguments de chaîne de requête après avoir reçu la requête, cela se fait généralement avec mod_rewrite. Si cela ne répond pas suffisamment à votre question, je vous suggère de poster une toute nouvelle question.
Jason
17
$argv[0]; // the script name
$argv[1]; // the first parameter
$argv[2]; // the second parameter

Si vous voulez que tout le script s'exécute quel que soit l'endroit d'où vous l'appelez (ligne de commande ou depuis le navigateur), vous voudrez quelque chose comme ce qui suit:

<?php
if ($_GET) {
    $argument1 = $_GET['argument1'];
    $argument2 = $_GET['argument2'];
} else {
    $argument1 = $argv[1];
    $argument2 = $argv[2];
}
?>

Pour appeler à partir de la ligne de commande chmod 755 /var/www/webroot/index.phpet utiliser

/usr/bin/php /var/www/webroot/index.php arg1 arg2

Pour appeler depuis le navigateur, utilisez

http://www.mydomain.com/index.php?argument1=arg1&argument2=arg2
Ap.Muthu
la source