Php 需要帮助配对数据库值吗
我正在一个基于Joomla的CMS网站上工作,目前在弄清楚如何匹配数据库值方面遇到了一些问题。我昨天发布了这个问题,但删除了它,因为我认为我已经解决了这个问题,而且这个问题的结构很糟糕。希望我能更好地表达我想要实现的目标。如果这里允许的话,我愿意把这篇文章发布到开发人员的网站上进行审查 说到这里,我查询了四个表。这四个表是items、attachments、tags,然后是另一个将tag ID与相关item ID配对的表 您可以在下面看到这些查询:Php 需要帮助配对数据库值吗,php,mysql,Php,Mysql,我正在一个基于Joomla的CMS网站上工作,目前在弄清楚如何匹配数据库值方面遇到了一些问题。我昨天发布了这个问题,但删除了它,因为我认为我已经解决了这个问题,而且这个问题的结构很糟糕。希望我能更好地表达我想要实现的目标。如果这里允许的话,我愿意把这篇文章发布到开发人员的网站上进行审查 说到这里,我查询了四个表。这四个表是items、attachments、tags,然后是另一个将tag ID与相关item ID配对的表 您可以在下面看到这些查询: // Get all Item
// Get all Items associated with this category page
// ID of current category
$current_cat = $this->category->id;
// Product IDs array
$product_ids_array = array();
// Product Names Array
$item_names_array = array();
// Product Descriptions Array
$item_descriptions_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where( $db->quoteName( 'catid' )." = " .$current_cat );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store Titles, Descriptions and IDs in arrays
foreach ($row as $value)
{
$item_names_array[] = $value->title;
$item_descriptions_array[] = $value->introtext;
$product_ids_array[] = $value->id;
};
// Now we're going to get the IDs of the tags associated with the items
// Create comma seperated list of product ids
$product_ids = implode(',', $product_ids_array);
// Tag IDs Array
$tag_IDs_array = array();
$tag_itemIDs_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'tagID', 'itemID' )));
$query->from( $db->quoteName( '#__k2_tags_xref' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag IDs and item IDs
foreach ($row as $value)
{
$tag_IDs_array[] = $value->tagID;
$tag_itemIDs_array[] = $value->itemID;
};
// Now we're going to get the names of the tags
// Create comma seperated list of tag ids
$tag_IDs = implode(',', $tag_IDs_array );
// Tag Names Array
$tag_names_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'name' )));
$query->from( $db->quoteName( '#__k2_tags' ) );
$query->where($db->quoteName('id') . ' IN (' . $tag_IDs . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag names
foreach ($row as $value)
{
$tag_names_array[] = $value->name;
};
// Now we're going to get the attachments
// Attachments Arrays
$attachment_itemID_array = array();
$attachment_id_array = array();
$attachment_filename_array = array();
$attachment_title_array = array();
$attachment_title_attr_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'id', 'itemID', 'filename', 'title', 'titleAttribute' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag names
foreach ($row as $value)
{
$attachment_itemID_array[] = $value->itemID;
$attachment_id_array[] = $value->id;
$attachment_filename_array[] = $value->filename;
$attachment_title_array[] = $value->title;
$attachment_title_attr_array[] = $value->titleAttribute;
};
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where($db->quoteName('alias') . ' LIKE '. $db->quote('acid-%') . ' AND ' . $db->quoteName('catid'). ' = ' . $current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
foreach ($row as $value) {
$a = 0;
$a++;
echo $value->title . '<br/>';
echo $value->introtext . '<br/>';
echo $value->id . '<br/>';
}
我不确定这是否是一个防弹的方法,以确保正确的附件链接到正确的项目,等等。我想这不是,但希望这是一个开始
更新2
我开始认为,在某些情况下,在返回查询值时使用关联数组会更好。我想这会让你更容易确定事情是否正确匹配
更新3
希望有人觉得这个有用。我正在尝试访问此怪物:
Array ( [0] => stdClass Object ( [id] => 2 [itemID] => 5 [filename] => Flotek-logo_1.png [title] => Flotek-logo_1.png [titleAttribute] => Flotek-logo_1.png ) [1] => stdClass Object ( [id] => 3 [itemID] => 6 [filename] => Logo_Court_Guru_Gray.png [title] => Logo_Court_Guru_Gray.png [titleAttribute] => Logo_Court_Guru_Gray.png ) [2] => stdClass Object ( [id] => 5 [itemID] => 4 [filename] => Icon_Search.png [title] => Icon_Search.png [titleAttribute] => Icon_Search.png ) )
因此,我可以使用它来检查当前项ID是否与数组中的项ID匹配,但在使用$array['itemID']行时,我得到了一个未定义索引的错误;很明显,我是用错误的方式处理这件事的。希望找到一些答案,我发现了一些但没有任何一个对完全不同的场景有意义的答案
好的,看起来像:
$attachmentRow[1]->itemID
这就是答案。现在我想知道是否有更好的方法访问它,因为我无法知道对象的索引。至少,我更愿意梳理关联数组中的每个对象
更新4
了解了如何使用json_解码简化数组
$attachmentResult = json_decode(json_encode($attachmentRow),true);
导致
Array ( [0] => Array ( [id] => 2 [itemID] => 5 [filename] => Flotek-logo_1.png [title] => Flotek-logo_1.png [titleAttribute] => Flotek-logo_1.png ) [1] => Array ( [id] => 3 [itemID] => 6 [filename] => Logo_Court_Guru_Gray.png [title] => Logo_Court_Guru_Gray.png [titleAttribute] => Logo_Court_Guru_Gray.png ) [2] => Array ( [id] => 5 [itemID] => 4 [filename] => Icon_Search.png [title] => Icon_Search.png [titleAttribute] => Icon_Search.png ) )
当使用某个较长的行时,仍然会出现索引未定义的错误
echo $attachmentResult['itemID'];
仍然在试图正确地访问关联数组
没关系。这是正确的方法
echo $attachmentResult[0]['itemID'];
更新5
好吧,我想我差不多明白了。我在这里找到了一个非常有用的解决方案:-非常方便搜索多维数组
已更新的项目/产品循环查询
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where($db->quoteName('alias') . ' LIKE '. $db->quote('acid-%') . ' AND ' . $db->quoteName('catid'). ' = ' . $current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
foreach ($row as $value) {
$itemID = $value->id;
$search_result = (search($attachmentResult, 'itemID', $itemID));
if($search_result) {
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'filename' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where( $db->quoteName( 'itemID' )." = " .$itemID );
$db->setQuery( $query );
$attachmentRow = $db->loadObjectList();
foreach ($attachmentRow as $attachmentValue) {
echo $attachmentValue->filename;
}
}
echo $value->introtext . '<br/>';
}
好的,我让它工作了。我不确定这是否是最优雅的解决方案。如果有人想附和改进,我洗耳恭听。希望这能帮助将来有类似问题的人 我的最终项目/产品循环查询:
// Get all Items associated with this category page
// ID of current category
$current_cat = $this->category->id;
// Product IDs array
$product_ids_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array('id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where( $db->quoteName( 'catid' )." = " .$current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store Titles, Descriptions and IDs in arrays
foreach ($row as $value)
{
$product_ids_array[] = $value->id;
};
// Now we're going to get the IDs of the tags associated with the items
// Create comma seperated list of product ids
$product_ids = implode(',', $product_ids_array);
// Tag IDs Array
$tag_IDs_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'tagID', 'itemID' )));
$query->from( $db->quoteName( '#__k2_tags_xref' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
$tagsRow = $db->loadObjectList();
$tagsResult = array();
$tagsResult = json_decode(json_encode($tagsRow),true);
// Store tag IDs and item IDs
foreach ($row as $value)
{
$tag_IDs_array[] = $value->tagID;
};
// Now we're going to get the names of the tags
// Create comma seperated list of tag ids
$tag_IDs = implode(',', $tag_IDs_array );
// Tag Names Array
$tag_names_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'name' )));
$query->from( $db->quoteName( '#__k2_tags' ) );
$query->where($db->quoteName('id') . ' IN (' . $tag_IDs . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag names
foreach ($row as $value)
{
$tag_names_array[] = $value->name;
};
// Now we're going to get the attachments
// Attachments Arrays
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'id', 'itemID', 'filename', 'title', 'titleAttribute' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$attachmentRow = $db->loadObjectList();
$attachmentResult = array();
$attachmentResult = json_decode(json_encode($attachmentRow),true);
// Function to search multidimensional arrays
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
// Now we're going to create our product loop
// Get Tag Names
foreach( $tag_names_array as $display_tag_name ) {
// Unformatted Tag Name - this is the one that will be displayed on the front end
$unformatted_display_tag_name = $display_tag_name;
// Convert Tag Name White Spaces to Dashes
$display_tag_name = preg_replace("/[\s_]/", "-", $display_tag_name);
// Lower Case Tag Name
$display_tag_name = strtolower($display_tag_name);
switch ( $display_tag_name == $display_tag_name ) {
case $display_tag_name:
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where($db->quoteName('alias') . ' LIKE '. $db->quote($display_tag_name.'-%') . ' AND ' . $db->quoteName('catid'). ' = ' . $current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Start Row
echo '<div class="row">';
// Start 12 Column
echo '<div class="col-lg-12">';
// Start Row
echo '<div class="row">';
// Start Item Container
echo '<section class="item-container">';
// Display Tag Name
echo '<div class="col-lg-12"><section class="tag-name"><a href="#">' . $unformatted_display_tag_name . '</a></section></div>';
foreach ($row as $value) {
// Start Column 6
echo '<div class="col-lg-6 is-hidden">';
// Store ID of item
$itemID = $value->id;
// Search attachmentResult array
$attachment_search_result = (search($attachmentResult, 'itemID', $itemID));
// Check to see if there are any associated attachments - display attachment is present
if($attachment_search_result) {
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'filename' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where( $db->quoteName( 'itemID' )." = " .$itemID );
$db->setQuery( $query );
$attachmentRow = $db->loadObjectList();
foreach ($attachmentRow as $attachmentValue) {
echo $attachmentValue->filename . '<br/>';
}
}
// Display Item Title
echo '<h5>' .$value->title. '</h5>';
// Display Item Text
echo '<p>' .$value->introtext. '</p>';
// End Column 6
echo '</div>';
}
// Close Item Container
echo '</section>';
// Close Row
echo '</div>';
// Close 12 Column
echo '</div>';
// Close Row
echo '</div>';
}
}
?>
<!-- /Display Category Items -->
警告:不要忘记调用$db->quote。。。在任何需要转义的值上。
// Get all Items associated with this category page
// ID of current category
$current_cat = $this->category->id;
// Product IDs array
$product_ids_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array('id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where( $db->quoteName( 'catid' )." = " .$current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store Titles, Descriptions and IDs in arrays
foreach ($row as $value)
{
$product_ids_array[] = $value->id;
};
// Now we're going to get the IDs of the tags associated with the items
// Create comma seperated list of product ids
$product_ids = implode(',', $product_ids_array);
// Tag IDs Array
$tag_IDs_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'tagID', 'itemID' )));
$query->from( $db->quoteName( '#__k2_tags_xref' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
$tagsRow = $db->loadObjectList();
$tagsResult = array();
$tagsResult = json_decode(json_encode($tagsRow),true);
// Store tag IDs and item IDs
foreach ($row as $value)
{
$tag_IDs_array[] = $value->tagID;
};
// Now we're going to get the names of the tags
// Create comma seperated list of tag ids
$tag_IDs = implode(',', $tag_IDs_array );
// Tag Names Array
$tag_names_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'name' )));
$query->from( $db->quoteName( '#__k2_tags' ) );
$query->where($db->quoteName('id') . ' IN (' . $tag_IDs . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag names
foreach ($row as $value)
{
$tag_names_array[] = $value->name;
};
// Now we're going to get the attachments
// Attachments Arrays
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'id', 'itemID', 'filename', 'title', 'titleAttribute' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$attachmentRow = $db->loadObjectList();
$attachmentResult = array();
$attachmentResult = json_decode(json_encode($attachmentRow),true);
// Function to search multidimensional arrays
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
// Now we're going to create our product loop
// Get Tag Names
foreach( $tag_names_array as $display_tag_name ) {
// Unformatted Tag Name - this is the one that will be displayed on the front end
$unformatted_display_tag_name = $display_tag_name;
// Convert Tag Name White Spaces to Dashes
$display_tag_name = preg_replace("/[\s_]/", "-", $display_tag_name);
// Lower Case Tag Name
$display_tag_name = strtolower($display_tag_name);
switch ( $display_tag_name == $display_tag_name ) {
case $display_tag_name:
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where($db->quoteName('alias') . ' LIKE '. $db->quote($display_tag_name.'-%') . ' AND ' . $db->quoteName('catid'). ' = ' . $current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Start Row
echo '<div class="row">';
// Start 12 Column
echo '<div class="col-lg-12">';
// Start Row
echo '<div class="row">';
// Start Item Container
echo '<section class="item-container">';
// Display Tag Name
echo '<div class="col-lg-12"><section class="tag-name"><a href="#">' . $unformatted_display_tag_name . '</a></section></div>';
foreach ($row as $value) {
// Start Column 6
echo '<div class="col-lg-6 is-hidden">';
// Store ID of item
$itemID = $value->id;
// Search attachmentResult array
$attachment_search_result = (search($attachmentResult, 'itemID', $itemID));
// Check to see if there are any associated attachments - display attachment is present
if($attachment_search_result) {
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'filename' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where( $db->quoteName( 'itemID' )." = " .$itemID );
$db->setQuery( $query );
$attachmentRow = $db->loadObjectList();
foreach ($attachmentRow as $attachmentValue) {
echo $attachmentValue->filename . '<br/>';
}
}
// Display Item Title
echo '<h5>' .$value->title. '</h5>';
// Display Item Text
echo '<p>' .$value->introtext. '</p>';
// End Column 6
echo '</div>';
}
// Close Item Container
echo '</section>';
// Close Row
echo '</div>';
// Close 12 Column
echo '</div>';
// Close Row
echo '</div>';
}
}
?>
<!-- /Display Category Items -->