从PHP脚本启动SQL查询

时间:2014-03-21 22:16:40

标签: php mysql

我制作了一个从txt文件启动sql查询的php脚本。但无法弄清楚为什么它无法在txt文件中看到查询。

PHP:

<?php
$dbhost = 'localhost:3036';
$dbuser = 'user';
$dbpass = 'password';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
  die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully!';
$txt = file_get_contents('sql_query.txt');
$queries = explode(';', $txt);
foreach($queries as $sql){
   mysql_query($sql);
}
mysql_select_db('db');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
  die('Could not complete query - error!!!' . mysql_error());
}
echo "Success!!!\n";
mysql_close($conn);
?>

错误是“无法完成查询 - 错误!!!查询为空”。 sql_query.txt文件包含UPDATE ... SET ... WHERE ...等查询;插入 ...;等

3 个答案:

答案 0 :(得分:0)

查看错误发生的位置:在

之后
$retval = mysql_query( $sql, $conn );

从那里回溯,$sql的价值是多少?好吧,自从你退出循环后你还没有设置它,所以不管数组的最后一个值是什么。

现在我还没有看到您的文本文件中的内容,但我猜测它在最后一次查询后以换行符结束 - 例如:

SELECT * FROM foo;\n
SELECT * FROM bar;\n

如果是这种情况,那么$sql的最后一个值可能是&#34; \ n&#34;,这显然不是SQL语句。

答案 1 :(得分:0)

你在这里遇到了几个问题。你在foreach循环之外打电话给mysql_query ......看起来并不正确。

此处发生的事情发生在foreach的末尾,变量$sql仍然存在。你实际上只是在循环之后检查返回值,所以实际上你的文件可能没什么问题,尽管你似乎在它的末尾有一个;字符,然后没有查询。这使得$queries的最后一个元素为空字符串。

您需要在循环中移动支票,如下所示:

foreach($queries as $sql){
    $retval = mysql_query( $sql, $conn );
    if(! $retval ) {
        die('Could not complete query - error!!!' . mysql_error());
    }
}

注意这些评论 - mysql_query等已经过时了。

答案 2 :(得分:0)

考虑下拉到命令行:

$dbuser = 'user';
$dbpass = 'password';
$sql_file = '/path/to/sql_query.txt';
$command = escapeshellcmd('mysql -u ' . $dbuser . ' -p' . $dbpass . ' < ' . $sql_file);
echo exec($command);

或者,如果您决定使用mysqli而不是mysql(正如其他人已经注意到的那样),您可以使用multi_query功能。

$dbhost = 'localhost:3036';
$dbuser = 'user';
$dbpass = 'password';
$sql_file = '/path/to/sql_query.txt';
// instantiate mysqli object
$db = new mysqli($dbhost, $dbuser, $dbpass);
if($db->connect_error) {
    die('MySQL connection failed with: ' . $db->connect_error);
}
$sql = trim(file_get_contents($sql_file));
// execute query
if ($result = $db->multi_query($sql)) {
    do {
        // do something with each query result if needed
        $query_result = $db->store_result();
    } while ($db->next_result());
} else {
    die('Query failed with: ' . $db->error);
}