gpt4 book ai didi

php - 需要帮助配对数据库值

转载 作者:行者123 更新时间:2023-11-29 03:32:22 25 4
gpt4 key购买 nike

我正在一个基于 Joomla 的 CMS 网站上工作,目前我在弄清楚如何配对我的数据库值时遇到了一些麻烦。我昨天发布了这个问题但删除了它,因为我认为我已经解决了这个问题,而且这个问题的结构很糟糕。希望我能够更好地阐明我想要完成的事情。如有必要,我愿意将其发布到开发站点以供审核(假设此处允许)。

话虽如此,我正在查询四个表。这四个表是项目、附件、标签,然后是另一个将标签 ID 与相关项目 ID 配对的表。

您可以在下面看到这些查询:

        // 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/>';

}

如您所见,最后一个代码块是对数据库的最终查询,我在其中使用通配符语句执行 SQL Select。我希望它是动态的。

使其动态化的想法是,项目具有与其名称前缀相匹配的标签。一个例子是我有一个名为“酸腐 eclipse 抑制剂”的标签,我有一个别名为“酸腐 eclipse 抑制剂-aci-136”的产品。别名是我可以从数据库中检索到的东西。

无论如何,问题不在于检索数据。问题是一旦我有了数据,我怎么能智能地将数据配对在一起呢?从我在每个实例中的查询中可以看出,我正在提取 itemID,因此我有一些东西可以比较,但从那时起我就迷路了。

我实际上是在尝试将项目与其相关联的标签(每个项目只有一个对应的标签)及其相关联的附件进行匹配。

我希望这是清楚的,如果不是,我会回来查看以进一步澄清并回答任何问题。任何帮助将不胜感激。

谢谢。

更新#1

我想知道 in_array() 是否是一个好的起点。至少我可以检查 itemID 是否存在。类似这样的事情:

       if( in_array( $value->id, $attachment_itemID_array ) ) {

echo 'match';

}

我不确定这是否是确保正确的附件链接到正确的项目等的防弹方法。我想这不是,但希望这是一个开始。

更新#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_decode 简化数组

$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

好吧,我想我差不多明白了。我找到了一个非常有用的解决方案,可以在这里找到:How to search by key=>value in a multidimensional array in PHP - 搜索多维数组非常方便

用于循环遍历项目/产品的更新查询

        $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 -->

关于php - 需要帮助配对数据库值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28704644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com