PHP 大会日本 2024

使用 PHP

本节收集了您在编写 PHP 脚本时可能遇到的许多常见错误。

  1. 我不记得 PHP 函数的参数顺序,它们是随机的吗?
  2. 我想编写一个通用的 PHP 脚本,它可以处理来自任何表单的数据。我如何知道哪些 POST 方法变量可用?
  3. 我需要将所有单引号 (') 转换为反斜杠后跟单引号 (\')。我如何使用正则表达式来做到这一点?我还想将 " 转换为 \",并将 \ 转换为 \\。
  4. 当我执行以下操作时,输出以错误的顺序打印:<?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?> 发生了什么事?
  5. 嘿,我的换行符去哪里了?<pre> <?php echo "This should be the first line."; ?> <?php echo "This should show up after the new line above."; ?> </pre>
  6. 我收到消息“警告:无法发送会话 Cookie - 标头已发送...”或“无法添加标头信息 - 标头已发送...”。
  7. 我需要直接访问请求标头中的信息。我该如何做到这一点?
  8. 当我尝试使用 IIS 进行身份验证时,我收到“未指定输入文件”。
  9. Windows:我无法使用 IIS 访问另一台计算机上共享的文件
  10. 我应该如何混合 XML 和 PHP?它抱怨我的<?xml 标签!
  11. 在哪里可以找到 PHP 中可用的所有变量的完整列表?
  12. 如何在不使用 PDFLib 等非免费和商业库的情况下生成 PDF 文件?我想要一些免费的并且不需要外部 PDF 库的东西。
  13. 一些 PHP 指令也可以采用简写字节值,而不是仅采用 int 字节值。所有可用的简写字节选项是什么?
我不记得 PHP 函数的参数顺序,它们是随机的吗?

PHP 是一种将数百个外部库整合在一起的粘合剂,因此有时会变得混乱。但是,一个简单的经验法则如下

数组函数 参数的顺序为“needle, haystack”,而字符串函数则相反,所以为“haystack, needle”。

我想编写一个通用的 PHP 脚本,它可以处理来自任何表单的数据。我如何知道哪些 POST 方法变量可用?

PHP 提供了许多预定义变量,例如超全局变量$_POST。您可以循环遍历$_POST,因为它是一个包含所有 POST 值的关联数组。例如,让我们简单地使用foreach循环遍历它,检查empty()值,并打印出来。

<?php
$empty
= $post = array();
foreach (
$_POST as $varname => $varvalue) {
if (empty(
$varvalue)) {
$empty[$varname] = $varvalue;
} else {
$post[$varname] = $varvalue;
}
}

print
"<pre>";
if (empty(
$empty)) {
print
"None of the POSTed values are empty, posted:\n";
var_dump($post);
} else {
print
"We have " . count($empty) . " empty values\n";
print
"Posted:\n"; var_dump($post);
print
"Empty:\n"; var_dump($empty);
exit;
}
?>

我需要将所有单引号 (') 转换为反斜杠后跟单引号 (\')。我如何使用正则表达式来做到这一点?我还想将 " 转换为 \",并将 \ 转换为 \\。

假设这是用于数据库,请使用数据库提供的转义机制。例如,使用 MySQL 使用mysql_real_escape_string(),使用 PostgreSQL 使用pg_escape_string()。还有更通用的addslashes()stripslashes()函数,在较旧的 PHP 代码中更常见。

当我执行以下操作时,输出以错误的顺序打印
<?php
function myfunc($argument)
{
echo
$argument + 10;
}
$variable = 10;
echo
"myfunc($variable) = " . myfunc($variable);
?>
发生了什么事?

为了能够在表达式中使用函数的结果(例如在上面的示例中将其与其他字符串连接),您需要return该值,而不是echo它。

嘿,我的换行符去哪里了?
<pre>
<?php echo "This should be the first line."; ?>
<?php
echo "This should show up after the new line above."; ?>
</pre>

在 PHP 中,代码块的结束标记为“?>”或“?>\n”(其中 \n 表示换行符)。因此,在上面的示例中,输出的语句将在一行上,因为 PHP 会省略代码块结束标记后的换行符。这意味着您需要在每个 PHP 代码块后插入一个额外的换行符,以使其打印出一个换行符。

为什么 PHP 会这样做?因为在格式化普通 HTML 时,这通常会让您的生活更轻松,因为您不希望出现换行符,但您必须创建极长的行或以其他方式使原始页面源代码难以阅读才能实现此效果。

我收到消息“警告:无法发送会话 Cookie - 标头已发送...”或“无法添加标头信息 - 标头已发送...”。

header()setcookie() 函数和会话函数 需要将标头添加到输出流中,但标头只能在所有其他内容之前发送。在使用这些函数之前,不能有任何输出,例如 HTML 输出。函数headers_sent() 将检查您的脚本是否已发送标头,并参阅输出控制函数

我需要直接访问请求标头中的信息。我该如何做到这一点?

如果您将 PHP 作为 Apache 模块运行,则getallheaders() 函数将执行此操作。因此,以下代码段将向您显示所有请求标头

<?php
$headers
= getallheaders();
foreach (
$headers as $name => $content) {
echo
"headers[$name] = $content<br />\n";
}
?>

另请参阅 apache_lookup_uri()apache_response_headers()fsockopen()

当我尝试使用 IIS 进行身份验证时,我收到“未指定输入文件”。

IIS 的安全模型在此处存在问题。这是在 IIS 下运行的所有 CGI 程序的常见问题。一种解决方法是创建一个纯 HTML 文件(未由 PHP 解析)作为进入已认证目录的入口页面。然后使用 META 标记重定向到 PHP 页面,或链接到 PHP 页面。然后 PHP 将正确识别身份验证。这不会影响其他 NT Web 服务器。有关更多信息,请参阅:» http://support.microsoft.com/kb/q160422/ 和手册中关于 HTTP 身份验证 的部分。

Windows:我无法使用 IIS 访问另一台计算机上共享的文件

您必须更改 转到 Internet Information Services。找到您的 PHP 文件并转到其属性。转到 文件安全 选项卡,编辑 -< 匿名访问和身份验证控制

您可以通过取消选中 匿名访问 并保持 集成 Windows 身份验证 选中来解决此问题,或者,通过选中 匿名访问 并编辑用户来解决此问题,因为用户可能没有访问权限。

我应该如何混合 XML 和 PHP?它抱怨我的<?xml 标签!

为了将 <?xml 直接嵌入到 PHP 代码中,您必须通过将 PHP 指令 short_open_tags 设置为 0 来关闭短标签。您不能使用 ini_set() 设置此指令。无论 short_open_tags 是否开启,您都可以执行以下操作:<?php echo '<?xml'; ?>。此指令的默认值为 On

在哪里可以找到 PHP 中可用的所有变量的完整列表?

阅读关于 预定义变量 的手册页面,因为它包含脚本可用的预定义变量的部分列表。可以通过调用 phpinfo() 函数查看可用变量的完整列表(以及更多信息)。请务必阅读关于 来自 PHP 外部的变量 的手册部分,因为它描述了外部变量的常见场景,例如来自 HTML 表单、Cookie 和 URL。

如何在不使用 PDFLib 等非免费和商业库的情况下生成 PDF 文件?我想要一些免费的并且不需要外部 PDF 库的东西。

有一些用 PHP 编写的替代方案,例如 » FPDF» TCPDF

一些 PHP 指令也可以采用简写字节值,而不是仅 int 字节值。所有可用的简写字节选项是什么?

可用的选项是 K(千字节)、M(兆字节)和 G(千兆字节),并且都区分大小写。其他任何内容都假定为字节。1M 等于 1 兆字节或 1048576 字节。1K 等于 1 千字节或 1024 字节。这些简写符号可在 php.iniini_set() 函数中使用。请注意,数值将转换为 int;例如,0.5M 将解释为 0

注意千字节与千字节

PHP 符号将 1 千字节描述为等于 1024 字节,而 IEC 标准则认为这是千字节。总结:k 和 K = 1024 字节。

添加注释

用户贡献的注释 1 条注释

robjbrain at gmail dot com
8 年前
如果您意外使用 KB、MB 或 GB 而不是 K、M 或 G,则不会给出任何错误消息。据我所知,字母字符将被忽略,并将被视为字节,因此 1GB 实际上等于 1 字节。phpinfo() 和 ini_get() 将报告您写入的内容,例如 1GB,因此即使您的设置存在问题,也不清楚您的设置有任何问题。
To Top