使用未定义的常量STDIN - 在第5行的C:\ wamp \ www \ study \ sayHello.php中假设为“STDIN”

时间:2014-01-17 11:34:46

标签: php stdin trim fgets

我想学习php& mySQL和我购买了一本书(php& mySql:缺少手册2edition)

我在win8 64bit机器上安装了Wampserver2.4。

服务器配置

Apache版本:2.4.4
PHP版本:5.4.12

在第一课中我得到了这个错误:(

Notice: Use of undefined constant STDIN - assumed 'STDIN' in C:\wamp\www\study\sayHello.php on line 5

这是文件中的php代码“sayHello.php”

<?php

echo "Hello there. So I hear you're learning to be a PHP programmer!\n";
echo "Why don't you type in your name for me:\n";
$name = trim(fgets(STDIN));

echo "\nThanks, " . $name . ", it's really nice to meet you.\n\n";

?>

8 个答案:

答案 0 :(得分:24)

只需在文件顶部定义STDIN常量,

define('STDIN',fopen("php://stdin","r"));

答案 1 :(得分:2)

尝试在文件顶部添加此内容

define('STDIN',fopen("php://stdin","r"));

答案 2 :(得分:2)

说明

Only CLI (命令行)SAPI纯粹定义了I/O constants,例如STDINSTDOUTSTDERR在这种环境中为方便起见。


解决方案

如其他答案所述,您可以在PHP代码中简单定义这些常量。您也可以检查defined()以避免通过CLI调用时出错。例如:

<?php

if (!defined('STDIN')) {
  define('STDIN', fopen('php://stdin', 'r'));
}

但是,请记住,php://stdin可能无法在非CLI SAPI(例如Apache或FPM)中以您期望的方式工作。例如,要在通过FPM执行时访问原始POST正文,可以改用php://input


更多信息

PHP具有many个不同的 SAPI (服务器应用程序编程接口),可让您在各种环境(例如Web服务器,电子邮件服务器或命令行, CLI)。示例包括:

  • CGI
  • FPM
  • Milter(电子邮件过滤器)
  • Apache

每个SAPI的初始条件和行为可能略有不同。其他一些differences between the CLI SAPI and other SAPIs包括:

  • header()无效。
  • 某些ini设置,例如html_errorsoutput_buffering具有不同的默认值(更适合CLI)。
  • 将当前工作目录(CWD)更改为您执行的脚本。

答案 3 :(得分:1)

当您尝试使用以下命令从PHP文件运行迁移时

Artisan :: call('migrate');

似乎时候也会产生此类错误。 要解决此问题,您可以简单地将代码替换为

Artisan :: call('migrate',['--force'=> true])

如果正在生产中,请确保使用--force标志。

答案 4 :(得分:0)

看起来你正在尝试使用一个名为STDIN的常量,它不存在。

STDIN用于使用fopen获取当前打开的流。

$file = fopen('file/path');

$name = trim(fgets(STDIN));

在没有当前打开的流的情况下使用STDIN将无效。

我也相信STDIN只适用于cli,但并非100%肯定。如果是这种情况,请使用与上述相同的代码,但将STDIN替换为$file;

答案 5 :(得分:0)

如果您希望使用“STDIN”常量正确执行代码,您有两个选择:

# php -r "fgets(STDIN);"

或:

# gedit file.php //make a file with <?php fgets(STDIN); ?>
# php file.php // execute the file

另一个选项:

#php
 <?php
      fgets(STDIN);
 ?>
 //click on ctrl+d

不会工作!!您可能必须在代码中定义“STDIN”常量,如上所述。

答案 6 :(得分:0)

有时您会将 ENV 更改为生产并尝试在该 ENV 中进行更新。所以最好把那个 ENV 改回本地。更改 .env 文件。

之前:APP_ENV=production

解决方案:APP_ENV=local

答案 7 :(得分:0)

当此错误来自 Youtube Data API code sample 时,这是因为示例设计为从 CLI 运行,并且基于浏览器的实现没有提供提示用户输入的方法那个 STDIN 行。

由于身份验证代码作为 $authUrl 变量中的参数提供,该变量在脚本第一次运行时会打印到屏幕上,因此我能够通过替换来解决我的问题

$authCode = trim(fgets(STDIN));

与:

$authCode = $_GET['code'];