Joh*_*ohn 41 php magic-quotes-gpc
我想关掉PHP的魔术引号.我无法访问php.ini.
当我尝试添加php_flag magic_quotes_gpc off到我的.htaccess文件时,我收到500内部服务器错误.这是我的.htaccess文件的样子:
AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用ini_set('magic_quotes_gpc', 'O'),但这没有效果.
如何关闭魔术报价?
Pet*_*ley 42
根据手册,您通常可以在共享主机上安装自定义php.ini,其中不使用mod_php,因此php_value指令会导致错误.对于suexec/FastCGI设置,php.ini在任何情况下都有一个per-webspace是很常见的.
-
我不认为O(大写字母o)是设置ini标志的有效值.您需要使用true/false,1/0或"on"/"off"值.
ini_set( 'magic_quotes_gpc', 0 ); // doesn't work
Run Code Online (Sandbox Code Playgroud)
编辑
在检查了ini设置列表后,我看到magic_quotes_gpc是一个PHP_INI_PERDIR设置(在4.2.3之后),这意味着你不能用它来改变它ini_set()(只有PHP_INI_ALL设置可以改变ini_set())
这意味着您必须使用.htaccess文件来执行此操作 - 或 - 实现脚本以反转魔术引号的效果.像这样的东西
if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) )
{
$_POST = array_map( 'stripslashes', $_POST );
$_GET = array_map( 'stripslashes', $_GET );
$_COOKIE = array_map( 'stripslashes', $_COOKIE );
}
Run Code Online (Sandbox Code Playgroud)
Pow*_*ord 30
虽然我不能说为什么php_flag会给你500 Internal Server Errors,但我会指出PHP手册有一个例子,用于检测魔术引号是否打开并在运行时从超级全局中删除它.与其他发布的不同,这个是递归的,将正确地从数组中删除引号:
更新:我今天注意到PHP手册中有以下代码的新版本,它使用了对超级全局变量的引用.
旧版:
<?php
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>
Run Code Online (Sandbox Code Playgroud)
新版本:
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
Run Code Online (Sandbox Code Playgroud)
gon*_*nzo 20
这将解决在创建本地php.ini文件时获取"未找到"类'PDO'的问题.
如果你不能使用htaccess文件关闭魔术引号(由于Pete Bailey已经给出的原因),只需:
添加行
magic_quotes_gpc =关闭
magic_quotes_runtime =关闭
magic_quotes_sybase =关闭
扩展名= pdo.so
extension = pdo_mysql.so
将其保存到执行脚本的目录中.
更新:如果您只想拥有新php.ini文件的一个副本,请将此行添加到根.htaccess文件中:
SetEnv PHPRC /path/to/site/root/public_html/php.ini
Run Code Online (Sandbox Code Playgroud)
显然你需要将ini文件移动到它的位置.
希望拯救某人2个小时,它刚刚带走了我!
djn*_*djn 10
.htaccess文件中的php_flag和php_value在技术上是正确的 - 但是对于仅作为Apache模块安装的PHP.在共享主机上,您几乎永远不会找到这样的设置; 由于与安全性相关的原因(保持服务器邻居不在文件中)以及phpsuexec以"你"而不是apache用户运行脚本的方式,PHP作为CGI运行.
因此Apache正确地给你一个服务器错误:除非加载了PHP模块,否则它不知道php_flag的含义.CGI二进制文件对Apache来说是一个外部程序,你不能在Apache中配置它.
现在好消息:你可以设置每个目录配置,放置一个名为' php.ini ' 的文件,并使用与系统主php.ini中相同的语法设置你的指令.在PHP手册中列出了所有可设置的指令:您可以设置标有PHP_INI_PERDIR或PHP_INI_ALL,而只有系统管理员可以设置在服务器范围的php.ini那些标记PHP_INI_SYSTEM.
请注意,这样的php.ini指令不会被子目录继承,你必须给它们自己的php.ini.
======================== ===============我的解决方案========= ===================(将你的php.ini重命名为php5.ini)
并在顶部(!),添加以下内容:
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so
Run Code Online (Sandbox Code Playgroud)
然后在.htaccess中,添加它(在顶部):
SetEnv PHPRC /home/your_path/to/public_html/php5.ini
Run Code Online (Sandbox Code Playgroud)
ps /home/your_path/to/正确更改(您可以通过<?php phpinfo(); ?>从典型的.php文件执行命令来查看该路径.)