PHP与Phpmyadmin的区别

3

我有一段代码,在phpmyadmin上执行后可以百分百地正常运行。

Create Temporary Table Searches  ( id int, dt datetime);
Create Temporary Table Searches1 ( id int, dt datetime, count int);

insert into Searches(id, dt) select a.id, now() from tblSavedSearches a;

insert into Searches1(id, dt, count)
select  
    b.savedSearchesId,
    (select c.dt from tblSavedSearchesDetails c where b.savedSearchesId = c.savedSearchesId order by c.dt desc limit 1) as 'dt', 
    count(b.savedSearchesId) as 'cnt'
from tblSavedSearchesDetails b
group by  b.savedSearchesId;

insert into tblSavedSearchResults(savedSearchId,DtSearched,isEnabled)
select id,now(),0 from Searches where not id in (select savedSearchId from tblSavedSearchResults);

update     tblSavedSearchResults
inner join Searches1 on tblSavedSearchResults.savedSearchId = Searches1.id    
Set        tblSavedSearchResults.DtSearched = Searches1.dt, tblSavedSearchResults.isEnabled = 1;

然而,当我将相同的代码放入以下的php中时,会生成一个错误。
$dba = DbConnect::CreateDbaInstance(); 
$query = "";

$query.="Create Temporary Table Searches  ( id int, dt datetime); ";
$query.="Create Temporary Table Searches1 ( id int, dt datetime, count int); ";

$query.="insert into Searches(id, dt) select a.id, now() from tblSavedSearches a; ";

$query.="insert into Searches1(id, dt, count) ";
$query.="select ";  
$query.="    b.savedSearchesId, ";
$query.="    (select c.dt from tblSavedSearchesDetails c where b.savedSearchesId = c.savedSearchesId order by c.dt desc limit 1) as 'dt', ";
$query.="    count(b.savedSearchesId) as 'cnt' ";
$query.="from tblSavedSearchesDetails b ";
$query.="group by  b.savedSearchesId; ";

$query.="insert into tblSavedSearchResults(savedSearchId,DtSearched,isEnabled) ";
$query.="select id,now(),0 from Searches where not id in (select savedSearchId from tblSavedSearchResults); ";

$query.="update     tblSavedSearchResults ";
$query.="inner join Searches1 on tblSavedSearchResults.savedSearchId = Searches1.id ";    
$query.="Set        tblSavedSearchResults.DtSearched = Searches1.dt, tblSavedSearchResults.isEnabled = 1; ";

$dba->DbQuery($query) or die(mysql_error());      

我收到了以下错误信息。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Create Temporary Table Searches1 ( id int, dt datetime, count int) insert into S' at line 1

请问是否有人可以协助我……

谢谢。


1
a) 你正在使用对象$dba执行数据库操作,但是使用函数mysql_error()来获取错误...所以这只是部分封装。为什么不使用现有的访问或抽象层,比如http://docs.php.net/pdo?b) 为什么要一次执行多个语句(多或少)?这并不能使它们像http://en.wikipedia.org/wiki/ACID那样具有原子性... - VolkerK
2个回答

4
如果您的$dba->DbQuery($query)方法实际上使用了mysql_query(我猜您是这样做的,因为您在使用mysql_error,则每个调用只能执行一个查询(引用)

mysql_query()向与指定链接标识符关联的服务器上当前活动的数据库发送唯一查询(不支持多个查询)


您需要:

  • 分离您的查询,并为每个查询调用mysql_query
    • 应该很容易:不要将所有查询连接成$query,而是逐个执行它们。
  • 或者停止使用mysql_*,开始使用MySQLi,它提供了一个mysqli_multi_query函数

你好,非常感谢,完美地解决了问题,逐个执行每个查询,就完成了!谢谢!这个表单真的很棒! - user330306
1
如果你收到了解决方案,请将答案标记为已接受。 - Oleg

1

通过PHP,您只能一次执行一个查询。每个新查询都需要调用$dba->DbQuery()一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接