【问题标题】:Use of undefined constant STDIN - assumed 'STDIN' in C:\wamp\www\study\sayHello.php on line 5使用未定义的常量 STDIN - 在第 5 行的 C:\wamp\www\study\sayHello.php 中假定为“STDIN”
【发布时间】:2014-02-06 17:28:34
【问题描述】:

我想学习php & mySQL,我买了一本书(php&mySql:缺失的手册2版)

我在win8 64位机器上安装了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

这是“sayHello.php”文件中的 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";

?>

【问题讨论】:

  • 脚本中的 STDIN 是什么?
  • 您的代码可以在CLI中正常工作
  • 正如 Rikesh 和 Abhik 提到的,我添加了 "define('STDIN',fopen("php://stdin","r"));"问题就解决了
  • PHP docs 提到只有 CLI SAPI 定义常量,例如 STDIN
  • @jchook 您能否将您的评论复制到答案中,以便我们对其进行投票?

标签: php stdin trim fgets


【解决方案1】:

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

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

【讨论】:

  • 这是一个 PHP 8 问题
【解决方案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(服务器应用程序编程接口),允许您在各种环境中执行 PHP 代码,例如您的 Web 服务器、电子邮件服务器或命令行 (CLI) .示例包括:

  • CGI
  • FPM
  • 过滤器(电子邮件过滤器)
  • 阿帕奇

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

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

【讨论】:

  • 请注意,当在交互模式下运行 PHP(运行php),或使用连接到标准输入的管道(运行echo Something | php)时,STDIN 将不能作为常量使用。可能不会立即显现出来。
【解决方案3】:

当您尝试使用从 PHP 文件运行迁移时

Artisan::call('migrate');

似乎到时候也会产生这些类型的错误。 为了解决这个问题,您可以简单地将代码替换为

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

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

【讨论】:

  • 我的问题的确切解决方案!谢谢!
【解决方案4】:

尝试将其添加到文件顶部

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

【讨论】:

    【解决方案5】:

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

    之前:APP_ENV=production

    解决方案:APP_ENV=local

    【讨论】:

    • 请分享更多细节 - 为什么要更改 APP_ENV 来解决给定的问题?
    • 在生产环境中升级数据库时出现错误。我将环境改回本地并解决了该错误。
    • 这对我来说似乎是一个完全不同的问题。此外,使用不同的环境是有充分理由的 - 切换它们以尝试其他设置是否可行,看起来像是解决实际问题的随机方式
    • 这实际上解决了我的问题。在 elasticbeanstalk 上运行迁移会导致尝试使用该网站时出错。我更改为 LOCAL 并运行迁移,之后一切正常。
    【解决方案6】:

    当此错误来自 Youtube Data API code sample 时,这是因为该示例设计为从 CLI 运行,并且基于浏览器的实现不提供提示用户输入该 @ 要求的输入的方法987654322@线。

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

    $authCode = trim(fgets(STDIN));

    与:

    $authCode = $_GET['code'];

    【讨论】:

      【解决方案7】:

      您似乎正在尝试使用名为 STDIN 的常量,但该常量不存在。

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

      $file = fopen('file/path');
      
      $name = trim(fgets(STDIN));
      

      在没有当前打开的流的情况下使用STDIN 将不起作用。

      我也相信STDIN 只能在 cli 下工作,但我不是 100% 确定。如果是这种情况,请使用与上述相同的代码,但将 STDIN 替换为 $file

      【讨论】:

        【解决方案8】:

        如果您希望使用“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”常量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-09
          • 2015-07-11
          相关资源
          最近更新 更多