下面是我到目前为止的附图。 1 =一个特征,2 =一个好处。
我需要做的是将功能与优势相匹配。第一个#1与第一个#2
相同
到目前为止我所拥有的是:
<?php
if ($result = $mysqli->query('SELECT FB_TEXT FROM `FB_DATA` WHERE `FB_MODELID` = "'.$sku_modelid.'" AND FB_TYPEID IN (1,2)')) {
while( $row = $result->fetch_assoc()){
echo "<tr><td>".$row['FB_TEXT']."</td></tr>";
}
}
?>
现在显示所有结果。需要做的是:
<tr>
<td>Feature</td>
<td>Benefit</td>
</tr>
有没有人知道如何才能实现这一目标?
答案 0 :(得分:2)
无法确保这种情况正确发生。相反,您应该将2连接在一起,使用单独的表并使用索引和唯一标识符。
如果始终一起使用功能和优点,您还可以向其添加另一列。
这将使一个表有4列:
答案 1 :(得分:1)
我不知道其他人在谈论什么,但是如果你知道FB_TYPEID
1
是FB_TYPEID
,它会被视为一项功能,当2
为SELECT
`FB_TYPEID`,
`FB_TEXT`
FROM
`FB_DATA`
WHERE
`FB_MODELID` = theModelIdYouAreLookingFor AND
`FB_TYPEID` IN (1,2)
ORDER BY
CASE `FB_TYPEID`
WHEN 1 THEN 0
WHEN 2 THEN 1
# switch this to:
# WHEN 2 THEN 0
# WHEN 1 THEN 1
# if you want benefit to show first
END
时,它被认为是一种好处,然后订购很容易。
使用此查询:
mysqli
确保您免受SQL injection的侵害。您现在使用$sku_modelid
查询的方式很容易受到SQL注入的影响(假设$sql = '
SELECT
`FB_TYPEID`,
`FB_TEXT`
FROM
`FB_DATA`
WHERE
`FB_MODELID` = ? AND
`FB_TYPEID` IN (1,2)
ORDER BY
CASE `FB_TYPEID`
WHEN 1 THEN 0
WHEN 2 THEN 1
END
';
if( $statement = $mysqli->prepare( $sql ) )
{
// bind $sku_modelid to the first (and only) questionmark (placeholder) as an integer
$statement->bind_param( 'i', $sku_modelid );
// execute the prepared statement
if( $statement->execute() )
{
// bind FB_TYPEID to $typeId and FB_TEXT to $text
$statement->bind_result( $typeId, $text );
while( $row = $result->fetch_assoc() )
{
// echo the table row
if( $typeId == 1 ) echo '<tr>';
echo '<td>' . $text . '</td>';
if( $typeId == 2 ) echo '</tr>';
}
}
}
之前未进行过清理)。您应该使用带有绑定参数的预准备语句。类似的东西:
mysqli
(可能会遗漏一些内容,因为我从不使用{{1}}库。但我相信它应该有用。)
答案 2 :(得分:0)
这是一种非常危险的方法。
从技术上讲,SQL没有任何“Order”概念。是的,实际上它会在你把它们放到那里时订购,但是不能保证它们会以预期的顺序出现。
你最好创建两个单独的表,一个用于“功能”,一个用于“好处。然后用外键加入它们。
SELECT * FROM features JOIN benefits ON features.link_id = benefits.link_id WHERE features.model_id = 1