使用不同的表名执行相同的查询

时间:2017-03-15 14:40:49

标签: php

我有一个包含一些表名和预定义SQL查询的数组 我希望对该数组中的所有表执行相同的查询。我的方法是遍历表数组并将当前表名替换为下一个(+1):

$tabs = array("abc", "def", "ghi", "jkl"); // array of tables

$query = "SELECT `col1`, `col2` FROM `abc`"; // example query

for($i=0; $i<sizeof($tabs); $i++){
    // ... execute ...

    echo $query; // for debugging

    $query = str_replace ( $tabs [$i], $tabs [$i+1], $query ); // replacing table names
}

这是输出:

SELECT `col1`, `col2` FROM `abc`
SELECT `col1`, `col2` FROM `def`
SELECT `col1`, `col2` FROM `ghi`
SELECT `col1`, `col2` FROM `jkl`

但在这种情况下,它会遇到这种情况,它会尝试访问不存在的索引(在这种情况下它是4)。
所以这个错误(或通知)发生了:

<b>Notice</b>:  Undefined offset: 4 in <b>[...][...]</b> on line <b>11</b><br />

有更好的方法吗?

6 个答案:

答案 0 :(得分:0)

您可以尝试在查询中添加标记并为每个表替换它,如下所示:

<?php

$tabs = array("abc", "def", "ghi", "jkl"); // array of tables
$query = "SELECT `col1`, `col2` FROM `%my_table%` "; // example query

foreach($tabs as $tab) {
    $query = str_replace("%my_table%", $tab, $query);
    echo $query;
}

答案 1 :(得分:0)

使用模板查询。

$tabs = array("abc", "def", "ghi", "jkl"); // array of tables

$tmp_query = "SELECT `col1`, `col2` FROM `%table%`"; // template query

echo $tmp_query ; // for debugging

foreach($tabs as $tab){

    $query = str_replace ('%table%', $tab, $tmp_query  ); // replacing table names

    echo $query ; // for debugging

    // ... execute ...
}

答案 2 :(得分:0)

$tabs = array('abc', 'def', 'ghi', 'jkl'); // array of tables

foreach($tabs as $tab) {
    $query = sprintf('SELECT `col1`, `col2` FROM `%s`', $tab);

    // do something with $query
}

说明:

  • 单引号比双引号快。
  • sprintf比str_replace更快,更灵活,因为您可以添加额外的参数。
  • foreach迭代数组中的每个项目,您不必担心数组索引。如果您希望使用数组索引,只需将foreach($array as $value)更改为foreach($array as $index => $value)即可使用$index
  • 这种方法效率最高。最容易阅读到目前为止提供的问题的解决方案 - 并用最少的代码行解决答案。

答案 3 :(得分:0)

运行此

$tabs = array("abc", "def", "ghi", "jkl"); // array of tables

$basequery = "SELECT `col1`, `col2` FROM "; // example query
foreach ($tabs as $tab){
   $query = $basequery." `".$tab."`";
}

答案 4 :(得分:-1)

首先,使用count()

而不是sizeof()

您可能已经注意到str_replace中的$ i + 1会导致错误。我会写代码更像:

$tabs = array('abc', 'def', 'ghi', 'jkl'); $query = 'SELECT col1, col2 FROM :table:'; foreach($tabs as $i => $tab) { $sql = str_replace(':table:', $tab, $query); echo $sql; // for debugging // ... execute ... }

通过使用foreach和第二个变量来存储所需的查询字符串($ sql),这可以避免数组索引的任何问题。

答案 5 :(得分:-1)

我会在您的代码中执行两项操作:首先我使用count,因为sizeofcount的别名,我将其分配给变量,因为按照Php手册这将带来更好的性能。然后我会使用if来防止错误。这不是为了重写代码而是继续使用for

$query = "SELECT `col1`, `col2` FROM `abc`"; // example query
$max = count($tabs);
for($i=0; $i<$max; $i++){
    // ... execute ...

    echo $query; // for debugging
    if($tabs[$i+1]<$max){
        $query = str_replace ( $tabs [$i], $tabs [$i+1], $query ); // replacing table names
    }
}