最终目标非常简单。我需要将文本文件中的一行文本变成红色,将其解析为几个变量,然后在网页中的表格中的单元格中显示这些变量。我已经使用mysql完成了数十次,但是从来没有测试文件。问题是我在单元格中得到了空白。但是,如果我从命令行运行,数据将按原样显示在单元格中。
在故障排除中,我将所有操作降至最低限度-只有一个变量和一个单元格。如果我硬编码变量$ mytest =“ 15”;工作正常。如果我从文本文件中抓取变量并将其读入$ mytest,则该变量在单元格中显示为空白,但从命令行看起来却很好。我什至可以将变量设置为15,然后通过exec将其发送到简短的C程序中,然后将$ mytest设置为等于返回值,并且仍然为空。
<?php
$handle = fopen("/home/vm725d/vmbrr.v2.6.6.vticketQ.log", "r");
$line = fgets($handle);
// process the line read.
$fields = explode("|",$line);
// Get data from fields
$vticket = explode (":", $fields[0]);
//$vTicket=$vticket[1];
$vTicket="15";
$mytest=exec ('/opt/observium/html/custom/fixstring ' . $vTicket);
//$mytest=$vTicket;
print "$mytest";
fclose($handle);
?>
<html>
<body>
<CENTER><B>V-Ticket Test</b> </CENTER>
<TABLE>
<FORM METHOD="POST" name=modticket action=modticket.php>
<center><TABLE bgcolor="#258e8e" width=800 border=1>
<TR></TR<TR></TR>
<TR>
<TD bgcolor="#FFFF99">vTicket:</TD>
<TD width=24><input name="thing1" value="<?php print $mytest;?>"></TD>
</TR>
</table>
<input type=submit name=create_case value="Update">
</FORM>
</body>
</html>
这里是fixstring C代码-请记住,我只是将其用作测试。
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[300])
{
int length = 0;
length = strlen(argv[1]);
char NEW[length];
memset (NEW,0,length );
strcpy(NEW, argv[1]);
printf ("%s",NEW);
}
当我将变量$ mytest设置为“ 15”时,网页上的单元格将显示vTicket为15。
当我将变量设置为文本文件中的值或Fixstring C程序的返回值时,它显示为空白。
但是,这是我在此实例中从命令行运行php时看到的内容
[root @ obs-stl-01自定义]#php vtest1.php
<html>
<body>
<CENTER><B>V-Ticket Test</b> </CENTER>
<TABLE>
<FORM METHOD="POST" name=modticket action=modticket.php>
<center><TABLE bgcolor="#258e8e" width=800 border=1>
<TR></TR<TR></TR>
<TR>
<TD bgcolor="#FFFF99">vTicket:</TD>
<TD width=24><input name="thing1" value="15"></TD>
</TR>
</table>
<input type=submit name=create_case value="Update">
</FORM>
</body>
</html>
但是该页面显示的是Thing1单元格的空白字段
我实际上可以捕获此输出并将其写入test.html,然后将浏览器指向该输出,并且显示正确。
我知道我想念的东西真的很蠢,但是我对这东西有些蛇。任何帮助将不胜感激。
谢谢!
答案 0 :(得分:0)
欢迎使用StackOverflow!听起来这可能是我的权限问题。从命令行运行时,PHP是从您的用户运行的,但通常由Web服务器(例如www-data
)的另一个用户运行。如果您的用户具有执行文件的权限,但Web服务器用户没有执行该文件的权限,则可能会导致出现以下问题:可以正常正常运行,但不能通过HTTP运行。
要快速检查这是否是您的问题,请尝试运行chmod +x /opt/observium/html/custom/fixstring
。现在可以在浏览器中使用吗?
希望如此。但是,从技术上讲,这是不安全的解决方案,因为现在任何用户都可以执行该文件。如果希望更加安全,则应该运行chmod o-x /opt/observium/html/custom/fixstring
来还原此更改,并运行chown www-data /opt/observium/html/custom/fixstring
来将文件的所有权更改为Web服务器,并假设www-data
是服务器的用户名。希望这会有所帮助!
答案 1 :(得分:0)
当我使用输入文件运行PHP时,该文件的格式由您解析的方式隐含,它可以按照您的描述工作。正如BradzTech的答案所暗示的,这很可能仅仅是权限问题。
无论如何,可能会帮助解决问题的方法是添加yarn
,print "$line\n";
和print_r($fields);
,以确保您正在阅读并解析自己的想法。
我会放弃print_r($vticket);
C程序进行故障排除;我认为这只是让您感到复杂。只需使用PHP即可打印出您要设置的变量,然后从输出结果与预期的第一点开始进行故障排除。
编辑:显示代码有效的最小示例...
您的PHP代码似乎没有任何问题。当我运行以下代码时,使用您对问题的评论中的输入行,为您的代码添加了建议的调试功能并修剪了HTML,得到了您所期望的结果:
fixstring
cat vmbrr.v2.6.6.vticketQ.log
vticket: 15 | From: John Doe | To: Jane Doe | Date: Wed, 17 Oct 2018 16:11:29 +0000 | User: Phil Collins | Program: TruthorDare | Issue: Cannot read text into v ariable | Area: 51 | POC: C. Darwin | Chargeline: R&D | ECD: 02/15/19 | Status: 0%
cat read-text-from-file.php
<?php
$handle = fopen("vmbrr.v2.6.6.vticketQ.log", "r");
$line = fgets($handle);
// process the line read.
$fields = explode("|",$line);
print_r($fields);
print "\n";
// Get data from fields
$vticket = explode (":", $fields[0]);
print_r($vticket);
print "\n";
$vTicket=$vticket[1];
$mytest=$vTicket;
print "$mytest\n";
fclose($handle);
?>
<TD width=24><input name="thing1" value="<?php print $mytest;?>"></TD>
php read-text-from-file.php
因此,我认为这是非代码问题,例如由于权限的原因而无法读取输入文件;还有很多其他可能性。