查询:ColdFusion到PHP

时间:2011-11-29 14:09:09

标签: php sql coldfusion

这是我的表结构:

Table artwork
AID CID SCID    Title   Dimensions  Medium  ArtFilePath ArtDate DateAdded   ThumbFilePath   DisplayOrder    Comments    Details 

Table categories
CID CategoryName

Table subcategories
SCID    CID SubCategoryName SubHeaderText

结果将为我提供变量getNext和getPrev,我可以这样使用:

<cfif prevDO gt 0 and getPrev.recordCount gt 0><a href="gallery_detail.cfm?AID=#getPrev.AID#">back</a></cfif>
<a href="gallery.cfm?CID=#getArt.CID#&SCID=#getArt.SCID#">#getArt.SubCategoryname#</a>
<cfif getNext.recordCount gt 0><a href="gallery_detail.cfm?AID=#getNext.AID#">next</a>    </cfif>

我在这里有三个在ColdFusion中运行的查询。 AID是艺术ID# CID是CategoryName ID#即Oils,Drawings,Computer Art等。 SCID是SubCategoryName ID#,即男性,女性,儿童等

这些查询选择所选的CID和SCID,并提供该组中的所有AID以供查看。换句话说,让我看看男性组中的所有精油。

<cfquery name="getArt" datasource="mssqlcf_PDartist1">
select * from Artwork a
join Categories b on (b.CID = a.CID)
join SubCategories c on (c.CID = b.CID and c.SCID = a.SCID)
<!---left join Categories on (Categories.CID = Artwork.CID)
left join SubCategories on (SubCategories.CID = Categories.CID)--->
where AID = #AID#
order by DisplayOrder
</cfquery>

<cfset nextDO = getArt.DisplayOrder + 1>
<cfset prevDO = getArt.DisplayOrder - 1>

<cfquery name="getNext" datasource="mssqlcf_PDartist1">
select AID from Artwork
where CID = #getArt.CID#
and SCID = #getArt.SCID#
and DisplayOrder = #nextDO#
</cfquery>

<cfquery name="getPrev" datasource="mssqlcf_PDartist1">
select AID from Artwork
where CID = #getArt.CID#
and SCID = #getArt.SCID#
and DisplayOrder = #prevDO#
</cfquery>

我一直在尝试用PHP开头做同样的事情:

<?php
$dbname = 'pdartist2';
    $table = 'artwork';
$result = mysql_query("SELECT * from artwork
a join categories b on (b.CID = a.CID)
join subcategories c on (c.CID = b.CID and c.SCID = a.SCID)
where AID = $AID
order by DisplayOrder") or die(mysql_error());  
while($row = mysql_fetch_array($result)){   
    $AID = $row['AID'];
    $ArtFilePath = $row['ArtFilePath'];
    $ThumbFilePath = $row['ThumbFilePath'];
    $Title = $row['Title'];
    $Dimensions = $row['Dimensions'];
    $Medium = $row['Medium'];       
    $Comments = $row['Comments'];
    $DisplayOrder = $row['DisplayOrder'];
    $Details = $row['Details']; 
}
mysql_free_result($getArt);
?>

<?php $nextDO = getArt.DisplayOrder +1; ?>

<!--getNext-->
<?php
$dbname = 'pdartist2';
$table = 'artwork';
$result = mysql_query("SELECT AID from artwork where CID = getArt.CID and SCID = getArt.SCID and DisplayOrder = $nextDO") or die(mysql_error());
mysql_query($query);
?> 

我遇到的问题是第二个查询的结果,因为我没有将第一个查询的结果导入$ getart。

问题是如何运行与这些ColdFusion查询具有相同结果的PHP查询?

3 个答案:

答案 0 :(得分:4)

另外,在双方,cf和php,不要忘记保护自己免受sql注射

例如,coldfusion代码:

where aid = < cfqueryparam cfsqltype="cf_sql_integer" value="#aid#">

答案 1 :(得分:0)

首先,你的循环:

while($row = mysql_fetch_array($result)){   
    $AID = $row['AID'];
    $ArtFilePath = $row['ArtFilePath'];
    $ThumbFilePath = $row['ThumbFilePath'];
    $Title = $row['Title'];
    $Dimensions = $row['Dimensions'];
    $Medium = $row['Medium'];       
    $Comments = $row['Comments'];
    $DisplayOrder = $row['DisplayOrder'];
    $Details = $row['Details']; 
}

没有做任何事情。 while()结构将循环遍历sql查询返回的每条记录,但您似乎只是每次都要覆盖变量。在不知道你的表结构的情况下,我认为你的第二个查询应该嵌套在while()循环中。然后,这将针对从第一个查询返回的每个记录运行该查询。

另外,在不知道你的表格结构的情况下,我怀疑这也可以通过在第一个查询上进行另一次连接来实现,但我想这取决于你。

答案 2 :(得分:-1)

  

我没有从第一个查询到$ getart的结果。

     

第一行是一个非常简洁的问题摘要。缺少的一件事是实际结果与您期望的结果有什么关系?例如

  

“我正在尝试检索第一行中的”DisplayOrder“值   增加它。但相反,我收到错误消息xyz...(或)我   从行y获取值。“

我的php充其量是可疑的,但据我所知,你的代码中没有声明$getart变量。您将查询结果分配给名为$result的变量,而不是$getart

$nextDO = getArt.DisplayOrder +1; 

那仍然是CF语法。我相信您需要先从结果对象中获取row。然后使用数组表示法访问该行中的特定column - 就像您在while循环中所做的那样。查看在线文档以获取确切的语法。

  

但我不知道我可以在循环中放入另一个查询。

我的CF代码中没有看到任何循环。如果你没有在CF中循环,那么在php中也没有必要。也就是说,无论如何,在循环内查询是一种不好的做法。这是非常低效的,应尽可能避免。