3

我有 9 个 MySQL 查询要在 PHP 中执行,我正在尝试像这样执行它们:

 if(mysqli_query($con, $q1)){
    ?><p>Query 1 complete</p><?
 }
 if(mysqli_query($con, $q2)){
    ?><p>Query 2 complete</p><?
 }
 if(mysqli_query($con, $q3)){
    ?><p>Query 3 complete</p><?
 }
 if(mysqli_query($con, $q4)){
    ?><p>Query 4 complete</p><?
 }
 if(mysqli_query($con, $q5)){
    ?><p>Query 5 complete</p><?
 }
 if(mysqli_query($con, $q6)){
    ?><p>Query 6 complete</p><?
 }
 if(mysqli_query($con, $q7)){
    ?><p>Query 7 complete</p><?
 }
 if(mysqli_query($con, $q8)){
    ?><p>Query 8 complete</p><?
 }
 if(mysqli_query($con, $q9)){
    ?><p>Query 9 complete</p><?
 }

但由于某种原因,只有第一个正在执行,并显示在数据库中。其余的都没有完成。关于执行多个查询,我是否遗漏了什么,或者我没有看到语法错误?

这是 $q2,因为它似乎不想超越它:

$q2 = "INSERT INTO outboundapps 
        (appid, 
         fk_outboundappkey, 
         name, 
         browser, 
         fk_urls, 
         fk_routes, 
         virtualplatform, 
         autoanswer, 
         fk_get) 
VALUES   ($last + 2, 
         $last + 2, 
         $oname, 
         $otype, 
         $last + 2, 
         $last + 2, 
         $ovirtualplatform, 
         1, 
         $last + 2)";
4

3 回答 3

1

“字段列表”中的未知列“测试”

如果您未能在单引号中分隔字符串文字,则可能会发生这种情况。

以这两个语句为例:

1. INSERT INTO mytable (col1) VALUES (test);

2. INSERT INTO mytable (col1) VALUES ('test');

不同之处在于,testin 查询 1 被假定为列标识符,而testin 查询 2 是字符串文字。

我知道在新行的 VALUES 子句中使用列标识符似乎没有意义——如果尚未插入该行,该列怎么会有任何值?实际上,如果您要命名此表中存在的列,则 INSERT 可以工作,但是对于新行,列值是 NULL。

INSERT INTO mytable (col1) VALUES (col1); -- no error, but inserts only a NULL

在您的示例查询中,您有:

$q2 = "INSERT INTO outboundapps 
        (appid, 
         fk_outboundappkey, 
         name, 
         browser, 
         fk_urls, 
         fk_routes, 
         virtualplatform, 
         autoanswer, 
         fk_get) 
VALUES   ($last + 2, 
         $last + 2, 
         $oname, 
         $otype, 
         $last + 2, 
         $last + 2, 
         $ovirtualplatform, 
         1, 
         $last + 2)";

为了帮助调试,您可以echo $q2在执行 SQL 之前查看它的真实外观。我希望它会是这样的:

INSERT INTO outboundapps 
        (appid, 
         fk_outboundappkey, 
         name, 
         browser, 
         fk_urls, 
         fk_routes, 
         virtualplatform, 
         autoanswer, 
         fk_get) 
VALUES   (125, 
         125, 
         test, 
         Firefox, 
         125, 
         125, 
         test, 
         1, 
         125)

看到该test查询中的不带引号了吗?这就是为什么它抱怨你命名了一个 unknown column test

提示:当您想将应用程序变量传递给查询时,最好使用准备好的语句,因为您不必担心参数周围的引号:

$q2 = "INSERT INTO outboundapps 
        (appid, 
         fk_outboundappkey, 
         name, 
         browser, 
         fk_urls, 
         fk_routes, 
         virtualplatform, 
         autoanswer, 
         fk_get) 
VALUES   (?, ?, ?, ?, ?, ?, ?, 1, ?)";

$stmt = mysqli_prepare($q2) or trigger_error(mysqli_error(), E_USER_ERROR);
$stmt->bind_param("iissiisi", $last2, $last2, $oname, $otype, $last2, 
    $last2, $ovirtualplatform, $last2);
$stmt->execute() or trigger_error($stmt->error, E_USER_ERROR);
于 2013-10-16T23:38:34.917 回答
1

使用 PHP 的新手...我遇到了同样的问题,尝试运行连续查询,简单的查询,只是基本的选择和更新;我所做的是关闭数据库并在每次调用之间重新打开:$dbh->close();

$dbh = db::GetInstance(); this was in a tutorial for SINGLETON db, seems to work ok
于 2014-07-18T08:37:56.417 回答
0

关于执行多个查询,我有什么遗漏吗?

不。

一般来说,在 mysqli 中运行多个查询显然没有什么特别之处。
事实上,几乎每个PHP 脚本都会以这种或另一种方式执行多次查询。

有没有我没有看到的语法错误?

问你的电脑,而不是人。旨在由计算机运行的程序 - 因此,判断语法是否错误或是否存在其他问题的唯一方法是运行程序。

只有第一个正在执行

如果某些查询未运行,则存在错误。
默认情况下,mysqli 不报告 mysql 错误,您必须明确设置它:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

当然,一般的 PHP 错误报告也必须打开。

没有错误信息,猜测是没有用的。

于 2013-10-16T15:59:36.410 回答