我有一个包含一些表名和预定义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 />
有更好的方法吗?
答案 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
}
说明:
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
,因为sizeof
是count
的别名,我将其分配给变量,因为按照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
}
}