我想学习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";
?>
答案 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,例如STDIN
,STDOUT
和STDERR
在这种环境中为方便起见。
如其他答案所述,您可以在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)。示例包括:
每个SAPI的初始条件和行为可能略有不同。其他一些differences between the CLI SAPI and other SAPIs包括:
header()
无效。html_errors
和output_buffering
具有不同的默认值(更适合CLI)。答案 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'];