【问题标题】:PHP PDO resulting in "Array" value rather than actual valuePHP PDO 导致“数组”值而不是实际值
【发布时间】:2013-07-19 14:55:58
【问题描述】:

我创建了一个查询 MySQL 数据库并显示结果的表单。现在我希望能够过滤我的结果。我有:

<input type="checkbox" name="multi_cif[]" value="<?php echo $g1 ?>"><font size="1" face="Arial, Helvetica, sans-serif">

在通过 foreach 显示所有结果的输出中,变量 $g1 是 MySQL 查询值(地址)。我希望能够单击结果旁边的这些复选框,因此当用户单击标有“过滤器”的按钮时,仅显示选中的结果。

目前我的代码如下:

<?PHP
if (isset($_POST['Submit2']))
{
$stmt = $dbh->prepare('SELECT * FROM CIF WHERE address LIKE ?');
$stmt->execute(array("%$_POST[multi_cif]%"));
//$stmt->execute(array(":term" => "%" . $_POST["multi_cif"] . "%"));
//$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
/*while ($results = $stmt->fetch())  //WILL UNCOMENT AND ADD OR LIKE AFTER SINGLE QUERY WORKING
{
    echo $results['address'];
    echo $results['alternativeid'];
}*/
print_r($_POST);
$results = $stmt->fetch();
echo $results['address'];
echo $results['alternativeid'];
}
?>

注释掉的东西是我尝试过的其他东西。我非常接近我的结果。以下代码的结果以:

 [multi_cif] => Array ( [0] => test.13ann.com [1] => testfortestltd444557.com.tw ) ) coralarray.ruhttp://mirror3.malwaredomains.com/files/domains.txt

很明显,“数组”是作为值传递的,而不是分配给 multi[] 的所需地址。有人可以解释为什么会这样并帮我解决吗?从昨天开始,我是 PDO 的新手,但我选择使用它并重新编写我的其他语句来实现准备好的语句,而不是动态地构建它们。提前致谢!

已编辑:我接受了布拉德的一些建议,但保留了声明,没有额外的“或地址 LIKE ?”现在我只点击一个复选框,但仍然得到“数组”而不是“test.13.ann.com”一旦我弄清楚为什么“数组”与值我将添加额外的 OR——感谢布拉德指出!

【问题讨论】:

  • 验证它不在您的数据库中...这可能是插入记录的代码有问题
  • 您将数组传递给 single LIKE 比较?这不应该是... address LIKE ? OR address LIKE ? 然后是-&gt;execute($_POST['multi_cif']) 吗? (当然,将% 添加到$_POST['multi_cif'] 中的每个值)
  • 其实由于输入的名字是multi[],而php正在检查multi_cif,所以很可能是检查'%%'
  • @aynber 这只是一个错字,我粘贴了错误的代码部分。

    是正确的“multi_cif”。我总共有 3 个要查询的表,一旦我弄清楚了,我打算对另外两个执行此操作。

标签: php mysql arrays pdo


【解决方案1】:

尝试访问第一个数组值,而不是外部数组 -

$stmt->execute(array("%{$_POST['multi_cif'][0]}%"));

要动态地做,你可以试试

// create n number of placeholders based off number of $_POST['multi_cif']
$place_holders = implode(' OR', array_fill(0, count($_POST['multi_cif']), ' address LIKE ?'));

// create n number of values based off number of $_POST['multi_cif']
$values = '"%'. implode('%","%', $_POST['multi_cif']).'%"';
// explode the values into an array
$values = explode(',',$values);

$stmt = $dbh->prepare("SELECT * FROM CIF WHERE $place_holders");
$stmt->execute(array($values));

【讨论】:

  • 非常感谢您的成功。我是动态创建的,但使用的是:$cif_num = count($multi_cif); while ($x &lt; $cif_num) { $stmt = $dbh-&gt;prepare('SELECT * FROM CIF WHERE address= ?'); $stmt-&gt;execute(array("%$multi_cif[$x]%")); while ($results = $stmt-&gt;fetch()) { echo $results['address']; echo $results['alternativeid']; } $x++; }
  • 我现在正在更改将 like 更改为 = 但由于某种原因导致结果出现问题。在 MySQL 命令行中,我的查询 SELECT * FROM CIF WHERE address = 'albface.com' 有效,但在 PDO 中无效。这只是帮助我学习 PDO 的辅助任务。任何人都知道为什么 = 不起作用?
  • $stmt = $dbh-&gt;prepare('SELECT * FROM CIF WHERE address = ?'); $stmt-&gt;execute(array($multi_cif[$x])) 应该可以工作。 (删除当前代码中的"%/%"
  • 啊,你是对的,又一次!我忘了删除“%/%”...这是一个漫长的一周的编码。非常感谢!
【解决方案2】:

你快到了。您没有正确连接参数。

试试

<?php
if (isset($_POST['Submit2']))
{
   $term = "%" . $_POST["multi_cif"] . "%";
   $stmt = $dbh->prepare('SELECT * FROM CIF WHERE address LIKE ?');
   $stmt->execute(array($term));
   $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
   while ($rows = $stmt->fetch())  
   {
       echo $results['address'];
       echo $results['alternativeid'];
   }
}
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2020-01-07
    • 2021-10-17
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多