【问题标题】:Preparing an array of strings to add to database准备要添加到数据库的字符串数组
【发布时间】:2019-01-05 20:13:54
【问题描述】:

我有以下数组要添加到数据库中。

$arr = array("a'a","b'b","c'c");

为了在添加到数据库之前转义单引号,我使用了这个 for 循环

for ($i=0; $i < count($arr); $i++) { 
  $arr[$i] = addslashes($arr[$i]);  
}

而且效果很好。但是如果把原来的数组改成这样:

$arr = array("first"=>"a'a","b'b","c'c");

然后我收到以下错误:

致命错误:第 12 行 /home/filepath/file.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 150994944 字节)

我不确定为什么当数组具有“first”的自定义键时会出现此错误。如果我手动对每个数组值使用添加斜杠,我不会得到这个错误,但是每当我把它放在 for 循环中时,我都会得到错误。

有没有人可以将addlashes 应用于每个数组值?我试过 mysqli_real_escape_string 而不是添加斜杠,但我得到了同样的错误。

【问题讨论】:

  • 对插入使用准备好的语句,而不是添加和删除斜杠
  • 你逃跑的方式不安全,使用准备好的语句,请让我们看看你的addlashes函数,以便我们为你提供帮助。

标签: php database escaping addslashes


【解决方案1】:

正如 cmets 中所述,您应该使用带有绑定变量的准备好的语句,而不是手动转义您的值(使用错误的函数...)。

您的错误的原因是您生成了一个永无止境的循环。

起初您的数组有 3 个元素,但是当您使用数字 for 循环而不是 foreach 时,在前两次迭代中,您将转义最后两个值,即索引 01。在第三次迭代中,您尝试使用键 2 转义数组中的元素,因为 $i2

但您的数组中没有元素具有键 2。所以你添加了第四个元素。之后的每次迭代都会发生这种情况;你添加新元素,$i 永远不会达到你的数组的计数,导致你循环直到内存用完。

【讨论】:

  • 感谢您指出这一点。你提到我用错误的函数来逃避我的价值观。你能简单地告诉我使用addlashes或mysqli_real_escape_string有什么问题吗?我在网上参加了一个简短的 php 课程,并被告知使用 mysqli_real_escape_string 来确保特殊字符不会引起问题。
  • @blah 也许看看 stackoverflow.com/a/16315399/3783243 或那里标记的 dup
  • @blah mysqli_real_escape_string 会更好,但正如您在手册中看到的,还有一个很大的 if。最好忘记转义,只需使用准备好的语句。
猜你喜欢
  • 1970-01-01
  • 2019-12-21
  • 2016-09-04
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多