Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php $wpdb->;更新或$wpdb->;插入导致在引号前添加斜杠_Php_Mysql_Wordpress - Fatal编程技术网

Php $wpdb->;更新或$wpdb->;插入导致在引号前添加斜杠

Php $wpdb->;更新或$wpdb->;插入导致在引号前添加斜杠,php,mysql,wordpress,Php,Mysql,Wordpress,这个问题在不同的地方被提出过几次,但我还没有找到一个明确的答案。大多数解决方案都涉及到人们说禁用php.ini文件上的魔术引号(我这么做了)或修改核心WP文件 无论如何,问题是:为什么每次我使用$wpdb->insert或$wpdb->update时,都会在任何单引号之前添加斜杠。例如: 我吃了草莓变成了我吃了草莓 以下是我使用的示例代码: $id = $_POST['id']; $title = $_POST['title']; $message = $_POST['message']; $

这个问题在不同的地方被提出过几次,但我还没有找到一个明确的答案。大多数解决方案都涉及到人们说禁用php.ini文件上的魔术引号(我这么做了)或修改核心WP文件

无论如何,问题是:为什么每次我使用$wpdb->insert或$wpdb->update时,都会在任何单引号之前添加斜杠。例如:

我吃了草莓变成了我吃了草莓

以下是我使用的示例代码:

$id = $_POST['id'];
$title = $_POST['title'];
$message = $_POST['message'];

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id))

这里也有同样的问题:但除了“禁用魔法报价”之外,这个问题从未得到解决。

在花了一天的时间之后,答案如下:

Wordpress在$u POST声明中转义,而不是在实际插入时转义,这很奇怪

$id = stripslashes_deep($_POST['id']); //added stripslashes_deep which removes WP escaping.
$title = stripslashes_deep($_POST['title']);
$message = stripslashes_deep($_POST['message']);

$wpdb->update('table_name', array('id'=>$id, 'title'=>$title, 'message'=>$message), array('id'=>$id));
这样做意味着WP将不会在任何引号之前添加斜杠。

更多信息——WordPress决定通过添加“神奇引号”让人们觉得自己疯了,即使从3.0版开始关闭了它。对$\u请求、$\u获取、$\u发布、$\u COOKIE或$\u服务器的任何访问都将受到影响。请参见
wp includes/load.php

 /* Add magic quotes to $_GET, $_POST, $_COOKIE, and $_SERVER.
 * @since 3.0.0
 */
function wp_magic_quotes() {
        // If already slashed, strip.
        if ( get_magic_quotes_gpc() ) {
                $_GET    = stripslashes_deep( $_GET    );
                $_POST   = stripslashes_deep( $_POST   );
                $_COOKIE = stripslashes_deep( $_COOKIE );
        }

        // Escape with wpdb.
        $_GET    = add_magic_quotes( $_GET    );
        $_POST   = add_magic_quotes( $_POST   );
        $_COOKIE = add_magic_quotes( $_COOKIE );
        $_SERVER = add_magic_quotes( $_SERVER );

        // Force REQUEST to be GET + POST.
        $_REQUEST = array_merge( $_GET, $_POST );
}
WordPress忽略内置的php magic quotes设置和值 使用get_magic_quotes_gpc()并始终添加magic quotes(即使在 该功能在5.4中从PHP中删除

你可以用这个来代替

//replace $_POST with $POST
$POST      = array_map( 'stripslashes_deep', $_POST);
$wpdb->insert( 
        'wp_mytable', 
        array( 
            'field_name'        => $POST['field_name'], 
            'type'              => $POST['type'],
            'values'            => serialize($POST['values']),
            'unanswered_link'   => $POST['unanswered_link'], 
        ), 
        array( 
            '%s','%s','%s','%s'
        ) 
    );
WordPress这样做是因为太多的核心代码和插件代码已经出现 依赖于引号的存在,所以禁用超级链接上的引号 globals(正如“基本示例”和“良好编码”中所做的那样 上述“实践”示例)可能会导致安全漏洞


您确定禁用了魔法引号吗?您是否在
phpinfo()
中进行了检查?是的,这是phpinfo-->magic\u quotes\u gpc Off-Off-magic\u quotes\u runtime Off-Off-magic\u quotes\u sybase Off中的摘录,这些额外/缺失的引号是在
update()
调用中还是在您的代码中?@phil正在添加额外的引号,这里没有拼写错误。看一看草莓的例子,看看它做了什么。这和wpdb->insert和wpdb->update实际上在前面加了一个斜杠有关,但我不知道如何禁用它that@fewpeople也许你误解了。你问题的最后一行代码是一堆乱七八糟的单引号。这就是它实际的样子吗?另外,您在哪里看到添加的斜杠(即,在echo'd标记、phpMyAdmin、MySQL控制台等中)?Life saver。谢谢@J李。如果不在这里,调试肯定会花费一些时间。您也可以使用
wp\u unslash()
总体上
$\u POST
array有趣的是,您还可以替换整个$\u POST变量本身(而不是创建没有下划线的新变量)。不知道这有多明智。。。