php 会话信息:SESSION_ID = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

noj0wjuj  于 2023-06-28  发布在  PHP
关注(0)|答案(9)|浏览(155)

我想学习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";

?>
yk9xbfzb

yk9xbfzb1#

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

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

cwxwcias2#

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

Artisan::call('migrate');

似乎时间也会产生这类错误。为了解决这个问题,你可以简单地替换你的代码

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

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

mzsu5hc0

mzsu5hc03#

说明

OnlyCLI(命令行)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
  • Milter(电子邮件过滤器)
  • Apache
  • 等等

每个SAPI可以具有稍微不同的初始条件和行为。其他differences between the CLI SAPI and other SAPIs包括:

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

uyto3xhc4#

试着把这个加到你的文件的顶部

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

nwnhqdif5#

当此错误来自Youtube Data API code sample时,这是因为示例设计为从CLI运行,而基于浏览器的实现不提供提示用户输入STDIN行所需输入的方法。
由于auth代码是作为$authUrl变量中的一个参数提供的,该变量在脚本第一次运行时打印到屏幕上,因此我能够通过替换
$authCode = trim(fgets(STDIN));
其中:
$authCode = $_GET['code'];

vsmadaxz

vsmadaxz6#

有时您会将ENV更改为生产环境,并尝试在该ENV中进行更新。所以最好把ENV改回本地。更改.env文件。
早期:APP_ENV=production
解决方案:APP_ENV=local

wdebmtf2

wdebmtf27#

对于Laravel开发者在运行Artisan命令Artisan::call('command');时遇到此错误,以下是解释和解决方案。

问题

当您使用$this->confirm()$this->anticipate()$this->choice()等执行询问问题的命令时,会发生错误。当您在执行代码中的命令时提出问题时,就会出现问题,因为它无法与提示进行交互和响应。

解决方案

要解决此问题,可以修改命令以接受直接提供答案的参数或选项,从而绕过用户交互的需要。
例如,当在生产环境中运行Artisan::call('db:seed')时,该命令将询问您是否确实希望运行seeder,因为它是在生产环境中运行的。您需要提供“是”或“否”的回答。通过使用--force选项,将不会询问该问题,播种程序将继续运行。这只是一个例子;您的命令中可能有其他问题,需要实现类似的解决方案。

wmvff8tz

wmvff8tz8#

看起来你正在尝试使用一个名为STDIN的常量,它不存在。
STDIN用于通过fopen获取当前打开的流。

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

$name = trim(fgets(STDIN));

使用STDIN而不使用当前打开的流将无法工作。
我也相信STDIN只在cli下工作,但我不是100%确定。如果是这种情况,使用与上面相同的代码,但将STDIN替换为$file;

dxxyhpgq

dxxyhpgq9#

如果你想让你的代码在“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”常量,如上所述。

相关问题