Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.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 MySQL准备语句与普通查询。收益与收益;损失 我正在更新/修改一些数据库代码,我想知道,我应该期望使用准备好的语句。_Php_Mysql_Web Services - Fatal编程技术网

Php MySQL准备语句与普通查询。收益与收益;损失 我正在更新/修改一些数据库代码,我想知道,我应该期望使用准备好的语句。

Php MySQL准备语句与普通查询。收益与收益;损失 我正在更新/修改一些数据库代码,我想知道,我应该期望使用准备好的语句。,php,mysql,web-services,Php,Mysql,Web Services,以以下代码为例: $values = ''; for ($i = 0; $i < $count; $i++) { $name = mysql_real_escape_string ($list[$i][1]); $voc = mysql_real_escape_string ($list[$i][3]); $lev = $list[$it][2]; $lev = is_numeric ($lev)? $lev : 0; $values .= ($v

以以下代码为例:

$values = '';
for ($i = 0; $i < $count; $i++) {
    $name = mysql_real_escape_string ($list[$i][1]);
    $voc = mysql_real_escape_string ($list[$i][3]);
    $lev = $list[$it][2];
    $lev = is_numeric ($lev)? $lev : 0;

    $values .= ($values == '')? "('$name', '$voc', $lev)" : ", ('$name', '$voc', $lev)";
}
if ($values != '') {
    $core->query ("INSERT INTO onlineCList (name, voc, lev) VALUES $values;");
}
如上所述,我是否应该预料到意外情况,在重新编码后使用准备好的语句?如果MySQL服务器必须使用大IN子句运行一个查询,或者使用相等检查运行多个准备好的查询(
。其中name=$name和..
),这对MySQL服务器有什么影响吗

假设所有内容都已正确索引

  • 事先准备好的声明更安全
  • 准备好的陈述有更好的表现
  • 准备好的语句更便于编写
  • 你会读所有这些吗

    也试试这个


    通常,如果您只是使用一个prepared语句来代替普通查询,那么它的速度会稍微慢一些,因为查询是通过两个步骤而不是一个步骤来准备和执行的。只有在准备语句并多次执行时,准备语句才会变得更快

    但是,在本例中,您使用的是
    mysql\u real\u escape\u string
    ,它执行到数据库的往返。更糟糕的是,您是在一个循环中执行的,因此,每个查询都要执行多次。因此,在这种情况下,用一份准备好的声明取代所有这些往返是一种双赢

    关于上一个问题,没有理由不能像通过普通查询解析器那样对准备好的语句使用相同的查询(即,没有理由执行一个版本的IN和另一个版本的or)。在(?,?)中可以有
    ,然后您只需绑定该数量的参数


    我的建议是总是使用事先准备好的陈述。在增加边际性能开销的情况下,它们的安全性(无SQL注入)和可读性优势仍然值得。当然,当您发现自己求助于
    mysql\u real\u escape\u string
    时,应该使用预先准备好的语句。(对于不需要转义变量输入的简单一次性查询,它们不是绝对必要的。)

    谢谢,我不知道调用时,
    mysql\u real\u escape\u string
    实际上与服务器通信;我只是假设字符编码是在您打开连接时存储的,
    mysql\u real\u escape\u string
    使用存储的信息在本地工作。是的,在PHP文档中,它应该更突出地做到这一点。ByTestStream被发送到MySQL,MySQL使用其字符集设置进行转义,并返回转义字符串。。。如果打开MySQL服务器的查询日志,您将看到所有这些“查询”。旧的查询在本地工作,但不尊重字符集,因此不推荐使用。仔细想想,这是有道理的,只有MySQL可以使用其确切的字符集实现转义字符串数据。一个明显的例子是准备好的语句。@joelhardi你对
    mysql\u real\u escape\u string
    的评论真的很有趣。这是否也适用于mysqli对应项?是否有任何基准可以显示开销是多少?我一直认为,当您只计划执行一次查询时,使用准备好的语句是没有意义的,所以我想知道您需要运行多少真正的\u escape\u字符串,而一个准备好的语句只执行一次,以使后者更具性能。我猜这是一个微优化,但我还是很感兴趣。mysql\u real\u escape\u字符串不会向服务器发送任何内容。考虑到实际的字符集,它会在客户端转义传递的字符串。@GeorgRichter我不知道您对该语句有什么证据,它绝对有。打开MySQL查询日志,您将在数据库服务器上查看查询,您将看到,如果没有数据库连接,
    mysql\u real\u escape\u string
    甚至无法正常工作(相反,它返回
    false
    )。顺便说一下,现在是2020年!任何人都不应该再使用PHP5.x,或原始的PHPmysql扩展,或
    MySQL real escape string
    。可能是2的重复。取决于上下文。3.这是您的观点。虽然准备好的语句很棒(特别是当您有用户输入之类的安全问题时),但texelate完全正确,而且还忘了提到它们不太便于读取/调试。就个人而言,我很少操纵用户输入,并尽量避免准备查询,通常是因为在需要修复失败的请求时,如果没有实际的SQL内容,这不会给我带来更多麻烦。它们仍然很棒,但也有理由不使用它们:)
    $names = '';
    while ($row = mysql_fetch_array ($result, MYSQL_ASSOC)) {
        $name = mysql_real_escape_string($row['name']);
    
        $names .= ($names == '') ? "'$name'" : ", '$name'";
    }
    if ($names != '') {
        $core->query ("UPDATE onlineActivity SET online = NULL WHERE name IN ($names) AND online = 1;");
    }