在外部文件中使用复杂(卷曲)语法
Use of Complex (curly) Syntax in external file
我在获取 sql 查询进行插值时遇到问题,请提供一些帮助,我将不胜感激。
在 pg_query_params 的手册页中,有一个 pg_query() 使用大括号传递变量的代码示例。这似乎正是我完成任务所需要的。所以,我的代码如下:
$fh = fopen('/home/www/KPI-Summary.sql',"r")
or die("Problem opening SQL file.\n");
$dbh = pg_connect("$connect")
or die('Could not connect: ' . pg_last_error());
$j = 0;
while (($line = fgets($fh)) !== false) {
$tmp[$j] = array(); // Initialise temporary storage.
$result = pg_query($dbh, $line); // process the line read.
if (!$result) { echo "Error: query did not execute"; }
...
while ($row = pg_fetch_row($result)) { // Read sql result.
$tmp[$j][2][] = $row;
}
$j++;
}
fclose($fh);
sql 文件包含多个查询,每行一个,如下所示:
SELECT count(*) from table WHERE value=0 AND msgid='{$arg[1]}';
但是,目前我的变量没有被内容替换——因此尽管查询运行正常,但它返回零行。我需要做什么才能获得预期的结果? (注意:每个 sql 行都不同,并且查询参数不是常量——因此在 sql 文件中使用变量。)
你用过pg_escape_string吗?
$arg[1] = pg_escape_string($arg[1]);
$line="SELECT count(*) from table WHERE value=0 AND msgid='{$arg[1]}';";
好的。我有 a 解决方案(尽管它可能不是 正确的 方法)。
这行得通——但我认为它需要润色。非常感谢有关更好的正则表达式的建议。
$bar = 'VALUE-A'; // Can we replace simple variable names?
$arg[1] = 'VALUE-B'; // What about an array, such as $arg[1]?
function interpolate($matches){
global $bar;
global $arg;
if ($matches[2]) {
$i = isset(${$matches[1]}[$matches[2]]) ? ${$matches[1]}[$matches[2]] : 'UNDEF';
} else {
$i = isset(${$matches[1]}) ? ${$matches[1]} : 'UNDEF';
}
return $i;
}
$fh = fopen('/home/www/file.sql',"r") or die("Failed.\n");
while (($line = fgets($fh)) !== false) {
...
$line = preg_replace_callback('|\{$([a-z]+)\[*(\d*)\]*}|i', "interpolate", $line);
echo $line; // and continue with rest of code as above.
}
fclose($fh);
(当然,解法提示题名完全错误,请问有什么办法修改吗?)
我在获取 sql 查询进行插值时遇到问题,请提供一些帮助,我将不胜感激。
在 pg_query_params 的手册页中,有一个 pg_query() 使用大括号传递变量的代码示例。这似乎正是我完成任务所需要的。所以,我的代码如下:
$fh = fopen('/home/www/KPI-Summary.sql',"r")
or die("Problem opening SQL file.\n");
$dbh = pg_connect("$connect")
or die('Could not connect: ' . pg_last_error());
$j = 0;
while (($line = fgets($fh)) !== false) {
$tmp[$j] = array(); // Initialise temporary storage.
$result = pg_query($dbh, $line); // process the line read.
if (!$result) { echo "Error: query did not execute"; }
...
while ($row = pg_fetch_row($result)) { // Read sql result.
$tmp[$j][2][] = $row;
}
$j++;
}
fclose($fh);
sql 文件包含多个查询,每行一个,如下所示:
SELECT count(*) from table WHERE value=0 AND msgid='{$arg[1]}';
但是,目前我的变量没有被内容替换——因此尽管查询运行正常,但它返回零行。我需要做什么才能获得预期的结果? (注意:每个 sql 行都不同,并且查询参数不是常量——因此在 sql 文件中使用变量。)
你用过pg_escape_string吗?
$arg[1] = pg_escape_string($arg[1]);
$line="SELECT count(*) from table WHERE value=0 AND msgid='{$arg[1]}';";
好的。我有 a 解决方案(尽管它可能不是 正确的 方法)。 这行得通——但我认为它需要润色。非常感谢有关更好的正则表达式的建议。
$bar = 'VALUE-A'; // Can we replace simple variable names?
$arg[1] = 'VALUE-B'; // What about an array, such as $arg[1]?
function interpolate($matches){
global $bar;
global $arg;
if ($matches[2]) {
$i = isset(${$matches[1]}[$matches[2]]) ? ${$matches[1]}[$matches[2]] : 'UNDEF';
} else {
$i = isset(${$matches[1]}) ? ${$matches[1]} : 'UNDEF';
}
return $i;
}
$fh = fopen('/home/www/file.sql',"r") or die("Failed.\n");
while (($line = fgets($fh)) !== false) {
...
$line = preg_replace_callback('|\{$([a-z]+)\[*(\d*)\]*}|i', "interpolate", $line);
echo $line; // and continue with rest of code as above.
}
fclose($fh);
(当然,解法提示题名完全错误,请问有什么办法修改吗?)