Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP/PDO将SQL脚本运行到PostgreSQL_Php_Sql_Postgresql_Pdo - Fatal编程技术网

使用PHP/PDO将SQL脚本运行到PostgreSQL

使用PHP/PDO将SQL脚本运行到PostgreSQL,php,sql,postgresql,pdo,Php,Sql,Postgresql,Pdo,我需要对数据库运行一些SQL脚本,以更新模式和数据(某种迁移) 因为在运行每个脚本之前需要检查一些逻辑,所以我正在编写一个小型PHP工具来执行脚本,但我有一个简单的问题:我可以直接加载并执行一个“简单”的SQL脚本(包括表操作、触发器和存储过程更新),还是应该在脚本中添加标记(以标记每个句子的结尾),然后一句一句地写剧本 对于数据库访问,我使用PDO。我今天遇到了类似的情况 我的解决方案非常简单,但足够聪明,可以允许跨多行的注释和语句 // open script file $scriptfi

我需要对数据库运行一些SQL脚本,以更新模式和数据(某种迁移)

因为在运行每个脚本之前需要检查一些逻辑,所以我正在编写一个小型PHP工具来执行脚本,但我有一个简单的问题:我可以直接加载并执行一个“简单”的SQL脚本(包括表操作、触发器和存储过程更新),还是应该在脚本中添加标记(以标记每个句子的结尾),然后一句一句地写剧本


对于数据库访问,我使用PDO。

我今天遇到了类似的情况

我的解决方案非常简单,但足够聪明,可以允许跨多行的注释和语句

// open script file

$scriptfile = fopen($script_path, "r");
if (!$scriptfile) { die("ERROR: Couldn't open {$scriptfile}.\n"); }

// grab each line of file, skipping comments and blank lines

$script = '';
while (($line = fgets($scriptfile)) !== false) {
    $line = trim($line);
    if(preg_match("/^#|^--|^$/", $line)){ continue; } 
    $script .= $line;
}

// explode script by semicolon and run each statement

$statements = explode(';', $script);
foreach($statements as $sql){
    if($sql === '') { continue; }
    $query = $pdo->prepare($sql);
    $query->execute();
    if($query->errorCode() !== '00000'){ die("ERROR: SQL error code: ".$query->errorCode()."\n"); }
}

这很有趣,但有一个问题:如果存在触发器或存储过程,您可以更改分隔符并使用另一个字符而不是分号,该怎么办?如果update或insert语句中有分号呢?我将看一看Joomla的源代码,看看他们在安装组件时是如何管理sql脚本的……好吧,Joomla使用了类似于您的东西:。是的,我的脚本肯定假设您自己编写了sql语句,并且可以防止边缘情况。否则,您将进行真正的解析,像这样的简单脚本是不够的。我总是喜欢简单的解决方案。