使用PHP和MYsql。我有两张桌子
我想要的是选择所有的‘标签’从表‘标签’,这是标签在同一字符串的‘标签’的表‘条目’,有一个给定的标签(变量$tag)。但是不知道,我只是尝试从表'entry‘中选择标记,其中的字符串在’$tag‘中包含指定的标记(变量.My),当前的代码是
$count=0;
$sql="SELECT tags FROM entry WHERE tag LIKE '%$tag%'";
$result = mysql_query($sql);
while($data=mysql_fetch_array($result)){
if(mysql_num_rows($result)!=0){
$tags1=explode(',',$data['tags']);
for($loop=0; $loop<=count($tags1)-1; $loop++){
if(!in_array($tags1[$loop], $tags2)){
$count+=1;
$tags2[$count]=$tags1[$loop];
}
}
}
}
发布于 2011-07-05 03:32:49
解决这个问题所遇到的困难都源于这样一个事实:您将标签列表存储在一列中。
您确实需要添加一个交集表,以包含标记和条目之间的多对多关系的数据。这是设计关系数据库的正确方法,如果这样做,许多SQL查询将变得更高效。
例如,要从匹配标记$tag
的条目中获取所有标记
<?php
$sql = "SELECT t1.tag FROM tag AS t1
INNER JOIN entries_tags AS e1 ON e1.tag = t1.id
INNER JOIN entries_tags AS e2 ON e2.entry = e1.entry
INNER JOIN tag AS t2 ON t2.id = e2.tag
WHERE t2.tag = ?";
$stmt = $pdo->prepare($sql);
$result = $stmt->execute( array($tag) );
$data = $result->fetchAll();
$count = count($data);
我在我的书“SQL Antipatterns第1卷:避免数据库编程的缺陷”中写了一章,详细介绍了这个设计引起的实际问题。
发布于 2011-07-05 03:08:00
将其作为一条语句执行的超级低效SQL注入攻击方法如下:
$sql="SELECT tags FROM entry WHERE 1=1 ";
然后在运行查询之前将每个标记添加到查询中:
$sql.="AND tag LIKE '" . $tags1[$loop] . "' ";
如果您想匹配任何标记,而不是所有标记,请将AND
替换为OR
。
不过,我确实建议对标记进行规范化,并考虑不以这种方式构建SQL查询。
https://stackoverflow.com/questions/6577583
复制相似问题