在循环中检查错误并执行查询?

时间:2013-01-21 20:07:22

标签: php mysql error-handling pdo

我需要能够在执行查询之前检查数组的所有元素是否有效,如果我这样做:

$arr = array(5, 3, 'test', 23, 9);
$query = $members->prepare("insert into mytable(a) values(:a)");

foreach ($arr as $val) {
    if (is_int($val)) {
       $query->execute(array(':a'=>$val));
    }
}

我只想将数组中的值插入到数据库中(如果它们都是ints),但它在数组中的'test'之前插入前两个值。这只是我为我所遇到的问题做出的一个随机例子。

最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

有两种方法可以解决这个问题:

1)遍历所有值并首先验证它(你真的应该验证不受控制的数据)。

2)如果你使用PDO / INNOdb启动一个事务运行该循环并且在验证回滚失败并且退出循环。

例如

$db->beginTransaction();
$arr = array(5, 3, 'test', 23, 9);
$query = $members->prepare("insert into mytable(a) values(:a)");
$success = true;
foreach ($arr as $val) {
    if (is_int($val)) {
       $query->execute(array(':a'=>$val));
    } else {
      $success = false;
      $db->rollback();
      break;

    }
}

if($success) {
 $db->commit();
}

答案 1 :(得分:0)

  

我只想将数组中的值插入到数据库中(如果所有这些都是整数)

当你需要检查数组时,循环总是你的朋友

$fault = 0;
foreach ($arr as $val) {
    if (!is_int($val)) {
        $fault = 1;
        break;
    }
}

答案 2 :(得分:0)

http://php.net/manual/en/function.array-filter.php

怎么样?

示例:

$arr = array(5, 3, 'test', 23, 9);
$nicearr = array_filter($arr, "getNumbersOnly")

function getNumbersOnly($var)
{
    return is_int($var);
}

然后只需使用$ nicearr进行查询/循环,因为您可以确定它们都是整数。