使用 PHP

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

我不记得 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_real_escape_string() 与 MySQL 一起使用,将 pg_escape_string() 与 PostgreSQL 一起使用。还有通用函数 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() 将检查你的脚本是否已经发送了标头,还可以参阅 输出控制函数

我需要直接访问请求标头中的信息。我该怎么做?

如果你以 Apache 模块的形式运行 PHP,则函数 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.ini 文件中和 ini_set() 函数中使用。请注意,数值会被强制转换为 int 类型;例如, 0.5M 被解释为 0

注意: 千字节与吉字节

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

添加备注

用户贡献备注 1 备注

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