【问题标题】:PHP error : Array to string conversionPHP错误:数组到字符串的转换
【发布时间】:2016-09-07 02:45:32
【问题描述】:

我有一个以 HTML 代码集命名的 PHP 文件,此代码用于显示要为下一个进程选择的几个位置 ID(表单为 GET)。

$sqloc = mysql_query("SELECT loc_id FROM location");
while ($row = mysql_fetch_array($sqloc)){

echo "<tr><td>
    <label><input type=\"checkbox\" name=\"chk_loc[]\" value=". $row['loc_id'] ." />
</td><td>" . $row['loc_id'] . "</td></tr></label>"; }

然后在其他 PHP 文件中,我使用此代码根据之前使用复选框选择的 ID 选择数据。

$cbarray = array();
if (isset($_GET['submit_location'])) {
  $cbarray = $_GET['chk_loc']; }

for ($i=0; $i<count($cbarray); $i++) {
  $sqlcb = mysql_query("SELECT * FROM location WHERE loc_id = '$cbarray'");
      while($ccb= mysql_fetch_row($sqlcb)) {
                print_r($ccb); }
}

但是当我运行它时,它会出现通知:

数组到字符串的转换 .... 第 62 行

在 ($sqlcb = mysql_query) 部分的第 62 行。我已经使用 var_dump 来检查数组,它会像这样打印数组:

array(4) { [0]=> string(5) "LO001" [1]=> string(5) "LO003" [2]=> string(5) "LO004" [3]=> string(5) "LO005" } 

有没有办法解决这个问题?谢谢。

【问题讨论】:

  • 所以,$cbarray 是数组,您正在尝试将其转换为字符串(在 sql 查询内部),您还能期待什么?还要注意sql注入问题
  • 简单的解决方法 - 你需要使用 ... WHERE loc_id='$cbarray'"); 而不是 ... WHERE loc_id='".$cbarray[$i]."'");.. 我想建议使用 PDO/mysqli 而不是弃用的 myqsl_-functions 和 foreach 而不是for。 Ofc 收到的参数需要清理或使用bind-ing 变量(使用 PDO/mysqli)。

标签: php mysql arrays database


【解决方案1】:

php 中的 Checkbox 作为数组处理。在代码中,id 为 chk_loc 的复选框作为数组存储在 $cbarray 中。 $sqlcb = mysql_query("SELECT * FROM location WHERE loc_id = '$cbarray'"); 在这段代码中,where 子句接受一个字符串,而您提供的是一个数组。

并使用PDO防止sql注入PDO PHP

【讨论】:

  • 加一个用于 PDO 建议。 MYSQL 函数已弃用且不安全。
  • @JacekKowalewski (y) (Y) :=)
  • 有可能编写伪劣的、不安全的查询并通过PDO::query 发送它们 - PDO 本身并不能阻止人们编写糟糕的代码。
  • @tadman 我不是在争论 反对 使用 PDO ...我反对这样的观点,即 PDO 本身就是治愈方法(原文如此 “使用 PDO 防止 sql 注入”)。现在,如果声明是使用带有参数化查询的 PDO,我不会反对。
  • @CD001 这是使用 PDO 的正确且可以说是唯一安全的方法。不要反对,这会让人们感到困惑,只要这样说,因为它解释了有关您的预订的一切。
【解决方案2】:

问题是因为这句话,

$sqlcb = mysql_query("SELECT * FROM location WHERE loc_id = '$cbarray'");
                                                                 ^ see here

$cbarray 实际上是一个数组,而不是字符串。您可以使用var_dump($cbarray); 查看它的结构。

所以解决方案是:

使用implode() 函数将数组元素与字符串连接并在查询中使用它,如下所示:

$cbarray = array();
if (isset($_GET['submit_location'])) {
    $cbarray = $_GET['chk_loc'];

    $query = "SELECT * FROM location WHERE loc_id IN ('" . implode("','", array_map('mysql_real_escape_string', $cbarray)) . "')";
    $sqlcb = mysql_query($query);
    while($ccb= mysql_fetch_row($sqlcb)) {
        print_r($ccb); 
    }
}

旁注:不要使用mysql_* 函数,它们在 PHP 5.5 中已被弃用,并在 PHP 7.0 中被完全删除。请改用mysqlipdoAnd this is why you shouldn't use mysql_* functions.

【讨论】:

  • @tadman OP 的查询容易受到 SQL 注入的影响,所以我也放了一个旁注以防万一
  • 我知道您指出了这一点,但您甚至没有尝试修复它,这就是我所说的。这就像“在这里,你指着你脚的枪被卡住了,但我修好了。”
  • 这是最好的工具,尽管它很糟糕。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2015-02-26
相关资源
最近更新 更多