【问题标题】:Error checking within loops and executing queries?循环内的错误检查和执行查询?
【发布时间】:2013-01-04 23:07:09
【问题描述】:

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

$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,我只想将它们插入数据库,但它会在数组中“测试”之前插入前两个值。这只是我弥补我遇到的问题的一个随机示例。

最好的方法是什么?

【问题讨论】:

  • 在运行查询之前进行 int 检查。或者至少将整个事情包装在一个事务中,这样如果任何一个查询失败,您就可以回滚。
  • 事务将是一种方式:在循环之前启动事务,然后在任何条目失败时回滚;或承诺成功;或在一个循环中验证,如果都通过验证,则在第二个循环中更新
  • 您遇到的问题的“非随机”示例是什么?你从哪里得到你的数组?
  • 遍历数组并检查元素。然后遍历数组并执行查询.....
  • @YourCommonSense:OP 创建这个抽象测试用例是正确的。希望我们能更频繁地看到它完成(即总是

标签: php mysql error-handling pdo


【解决方案1】:

有两种处理方式:

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();
}

【讨论】:

  • 有道理,但 $success = false 不应该高于 break; 吗?
  • 是的,它应该是......会修复它
【解决方案2】:

如果数组中的值都是整数,我只想将它们插入数据库中

当您需要检查数组时,循环始终是您的朋友

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

【讨论】:

  • 不知道我将在哪里执行查询
  • 这将在您的代码块之前,然后您将在 if(!$fault) { /*your code */} 中包装您的代码块
  • 是的,然后我就遇到了与开始时相同的问题
【解决方案3】:

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 用于您的查询/循环,因为您可以确定它们都是整数。

【讨论】:

  • 这不是他要求的,他的要求是只在所有数据都有效的情况下进行查询,这仍然会在忽略不良数据的情况下运行查询。
  • 这是一种获取有效数据的巧妙方法。您所需要的只是比较 $arr 和 $nicearr 的长度。 if (count($arr) == count($nicearr)) { // 启动 db 进程 }
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
相关资源
最近更新 更多