【问题标题】:PHP: Create dynamic (variable) file name- Undefined variable: 65PHP:创建动态(变量)文件名 - 未定义变量:65
【发布时间】:2014-10-17 10:31:40
【问题描述】:

我需要在 PHP 中设置一个动态文件名。所以我写了一个小示例脚本来代表我面临的问题。

当我运行以下脚本时,我得到以下错误输出,并且创建的文件刚刚命名为 .csv 而它应该命名为 0101.csv

输出:

Notice: Undefined variable: 65 in C:\xampp\htdocs\testsEight.php on line 5

Notice: Undefined variable: 65 in C:\xampp\htdocs\testsEight.php on line 7
Array ( [0] => BillClinton )

为什么将变量称为65 而不是$the_id?我正在尝试关注these guidelines。在下面的代码中,我也尝试将其替换为${$the_id},没有运气!

代码:

<?php

$type = 'BillClinton';
$the_id = 0101;
file_put_contents ( 'C:/'.$$the_id.'.csv' , $type ."," , FILE_APPEND );

$file = fopen('C:/'.$$the_id.'.csv', 'r');
$line = fgetcsv($file);
array_pop($line);

if ($line !== FALSE) {
    //$line is an array of the csv elements in a line. The fgetcsv() function parses a line from an open file, checking for CSV fields.The fgetcsv() function stops returning on a new line, at the specified length, or at EOF, whichever comes first.
    print_r($line);//check
} else {echo 'FALSE';}

请帮我解决这个问题。

【问题讨论】:

  • 您在$$the_id 中使用了两个$,在$the_id = 0101; 中使用了一个,但是前导零也可能是一个因素(被读取为八进制?)所以你可能想要包装它引号$the_id = "0101";
  • @Fred-ii- 首先,非常感谢。其次,我的问题是,在实际程序中,$the_id 来自数据库。所以我不太确定它是一个字符串(引号)还是一个数字。那么有没有办法确保如果它是一个数字,它保持不变并且不会被转换?
  • 不客气,Zarah,干杯

标签: php file csv filenames variable-variables


【解决方案1】:

您在$$the_id 中使用了两个$,在$the_id = 0101; 中使用了一个

“为什么把变量称为65”

前导零将0101 视为八进制,因此将其用引号括起来$the_id = "0101";

【讨论】:

  • 首先,非常感谢。其次,我的问题是在实际程序中 $the_id 来自数据库。所以我不太确定它是一个字符串(引号)还是一个数字。那么有没有办法确保如果它是一个数字,它保持不变并且不会被转换?
  • @Zarah 不客气。让我想想那个。但是,如果您保留为$the_id = "0101"; 等,您可以继续使用吗?
  • 不,我为这个小例子硬编码了0101。在实际程序中,$the_id 来自数据库。而且我不确定它是一个字符串(带引号)还是一个数字(不带引号)。
  • @Zarah 我不知道那个插件,但我会看看我能找到什么。如果我不能或其他任何人给出了答案,你可能需要问另一个问题,展示你是如何从中拉出来的,并标记为 Moodlemysql - mysqli 如果那是您正在使用的 API。
  • @Zarah 你也可以试试$the_id = int($variable);
【解决方案2】:

$$the_id 中有额外的 $,这导致调用 $the_id 的引用而不是变量名 the_id。所以你需要删除它。代码如下;

<?php

$type = 'BillClinton';
$the_id = 0101;
file_put_contents ( 'C:/'.$the_id.'.csv' , $type ."," , FILE_APPEND );

$file = fopen('C:/'.$the_id.'.csv', 'r');
$line = fgetcsv($file);
array_pop($line);

if ($line !== FALSE) {
    //$line is an array of the csv elements in a line. The fgetcsv() function parses a line from an open file, checking for CSV fields.The fgetcsv() function stops returning on a new line, at the specified length, or at EOF, whichever comes first.
    print_r($line);//check
} else {echo 'FALSE';}

更多详情可以关注PHP documentation

【讨论】:

  • I said that 4-5 分钟前。 OP想使用变量变量php.net/manual/en/language.variables.variable.php
  • 抱歉,我没看到。
  • 另外,OP 声明 “为什么将变量称为 65” - 这是因为未引用的 0101 被视为八进制;我也说过。
  • 我很高兴可以在没有变量变量的情况下完成我想要的事情。但问题是我不希望未引用的 0101 被视为八进制,因为它来自数据库,所以我无法控制将 " 放在它周围。
  • @Zarah,不管是string 还是integer。当与'C:/'.$id.'.csv' 连接时,$id 成为一个字符串,无论其初始类型如何。作为提示,如果你愿意,你可以控制它的类型,它被称为type-casting,(string)$the_id 将返回0101 作为字符串'0101'。与(int)(bool)(float) 等相同。
【解决方案3】:

首先,你的例子是错误的。 PHP 永远不会允许您将整数定义为变量名,甚至不允许将“字符串转换”整数定义为变量名。

您的脚本中唯一的问题是您使用了双美元符号,这是对$0101 的引用(假设$the_id0101 字符串或整数,没关系)。

简单的解决方案是删除您的双美元符号:

file_put_contents ( 'C:/'.$the_id.'.csv' , $type ."," , FILE_APPEND );

$file = fopen('C:/'.$the_id.'.csv', 'r');

这背后的想法是变量的名称可以是可变的。你的问题就是这样出现的。

$a = 'hello';
$$a = 'world';

echo $hello; // will output 'world';

问候。

【讨论】:

  • 删除多余的$ 后,它确实会写入文件,然后也会读取它。 @Fred-ii- 提到的唯一问题是当0101 是一个整数时(即它没有被引用),它被视为八进制,因此转换为65 并且文件被命名为65.csv
  • 赞成,因为 $$ 实际上是问题所在。但正如我在上面的评论中提到的,我不清楚答案的一部分,即“假设 $the_id 是 0101 字符串或整数,没关系”。如果你能澄清这一点,我将不胜感激,这样我就可以了解您试图解释的内容。谢谢。
  • @Zarah 抱歉回复晚了。当您在 PHP 中手动定义像 $var 这样的变量时,您将无法仅使用整数来定义它的名称。意思是,$0101 是不可能的,并且会导致致命错误,请记住这一点,您会想到 $the_id 从数据库中以integer 的形式返回的事实(或者我猜,如果它是一个索引,它就是最有可能是整数)。无论哪种方式,当将整数类型 var 连接到字符串中时,它将被连接起来,结果将是 string。即使$the_id 是 int 或 string,结果仍然是 string。希望你能明白。
  • 是的,我明白了。我有这个问题,如果我们将一个整数与一个字符串连接起来,这是否会产生一个字符串。所以非常感谢。
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 2011-10-27
  • 2021-12-31
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多