PHP在使用奇怪的引号时遇到障碍

PHP snag when using strange quotes

提问人:troppapolvere 提问时间:10/7/2023 最后编辑:Your Common Sensetroppapolvere 更新时间:10/9/2023 访问量:44

问:

复制一个 mySQL 驱动的应用程序及其网页(在 PHP 中),我花了 2 天时间调试以下代码所示的问题。当然,2个“不起作用”注释不适用于源服务器(一切正常),但适用于没有任何工作的目标服务器! 网页不分青红皂白地使用单(十六进制 27)、双(十六进制 22)和“滑稽”(十六进制 e2 80 99)的混合。

我能做些什么?“sed'ing”每一页都很容易,但下次什么时候呢 我必须再次重新迁移这些页面吗?

谢谢!

<?php

  echo "Welcome to a quote adventure<BR><HR>";

  $_SESSION['number1']=1;
  $_SESSION['number2']=2;
  $_SESSION['number3']=3;

  echo "my number1 (single-to-single quotes) is: ".$_SESSION['number1']."<BR>";
  echo "my number2 (single-to-double quotes) is: ".$_SESSION["number2"]."<BR>";
  echo "my number3 (single-to-funny quotes) is: ".$_SESSION[’number3’]."-------didn't work!<HR>";
 
  $_SESSION["number1"]=1;
  $_SESSION["number2"]=2;
  $_SESSION["number3"]=3;

  echo "my number1 (double-to-single quotes) is: ".$_SESSION['number1']."<BR>";
  echo "my number2 (double-to-double quotes) is: ".$_SESSION["number2"]."<BR>";
  echo "my number3 (double-to-funny quotes) is: ".$_SESSION[’number3’]."-------didn't work!<HR>";
 
  $_SESSION[’number1’]=1;
  $_SESSION[’number2’]=2;
  $_SESSION[’number3’]=3;

  echo "my number1 (funny-to-single quotes) is: ".$_SESSION['number1']."<BR>";
  echo "my number2 (funny-to-double quotes) is: ".$_SESSION["number2"]."<BR>";
  echo "my number3 (funny-to-funny quotes) is: ".$_SESSION[’number3’]."-------worked!<HR>";
?>

我期望网页也能在目标服务器上不加修改地工作

PHP 行情

评论

0赞 redwards 10/7/2023
你是如何复制mysql数据库的?请提供更多信息。
3赞 Your Common Sense 10/7/2023
基本上,“奇怪的引号”在任何PHP版本中都没有任何意义。你必须一劳永逸地摆脱它们。它们不会在任何合理的意义上“工作”。
0赞 Your Common Sense 10/7/2023
此外,作为一个程序员,你应该注意PHP在运行你的代码时发出的错误消息。在您的情况下,这是不言自明的。
1赞 Álvaro González 10/7/2023
您使用哪种过程来复制插入排版引号的文件?将它们粘贴到 Microsoft Word 中?
2赞 Your Common Sense 10/7/2023
@ÁlvaroGonzález我想这些引号可能已经存在于代码中,它甚至可以在较旧的 PHP 版本中“工作”,尽管左右吐出警告

答:

0赞 Álvaro González 10/9/2023 #1

如果您更换了服务器,但没有彻底查看 PHP 设置,那么您很可能依赖于已更改的默认值,尤其是与错误报告相关的默认值。你的代码从来都不是完全正确的,它部分地工作纯粹是偶然的,但你现在才意识到。

PHP 一直在强化一些错误条件,因为它们是令人沮丧的错误的来源,并没有真正起到任何作用。特别是,从不存在的常量读取已从通知提升为警告:

  1. 早期的 PHP:假设你错过了引号,实际上想要一个字符串,触发通知。
  2. PHP/7.2:相同的假设,触发警告。
  3. PHP/8.0:不再猜测,触发致命错误。

...主要区别在于致命错误会中止脚本,因此不能轻易遗漏或忽略。

这个不存在的常量问题如何适用于此处?好吧,事实证明,这是常量的有效标识符,只要您不在解析器阻塞的位置使用它:

define('’a’', 'example');
$foo = ['example' => 'OK'];
var_dump(’a’, $foo[’a’]);
string(7) "example"
string(2) "OK"

演示