2012-02-12 83 views
0

我试图生成用户参加的事件列表。我所要做的就是搜索列并使用LIKE将用户标识与存储在每列中的名称进行比较。使用LIKE子句的sql:php

现在我有两个不同的事件存储在我的数据库中进行测试,每个事件都有一个唯一的eventID。我使用的登录用户正在参加这两个事件,但它只显示eventID1而不是eventID1和eventID2。

用户名存储在由“〜”分隔的名为acceptedInvites的列中。所以现在它显示用户参加的“1〜2”。我可以使用%像%来拉这些事件吗?

$userid = $_SESSION['userid']; 
echo "<h2>My Events</h2>"; 
    $myEvents = mysql_query("select eventID from events where acceptedInvites LIKE '%$userid%' "); 
    $fetch = mysql_fetch_array($myEvents); 
     foreach($fetch as $eventsAttending){ 
      echo $eventsAttending['eventID']; 
      } 

我的输出就是11,当它应该是12

+1

您应该*将数据库架构规范化为跨表的常见一对多关系或可能的多对多关系。这会使这个问题变得更容易。 – deceze 2012-02-12 02:23:22

回答

1

而不是使用foreach(),使用while()这样的:

$myEvents = mysql_query("SELECT `eventID` FROM `events` WHERE `acceptedInvites` LIKE '".$userid."'"); 
while ($fetch = mysql_fetch_array($myEvents)) 
{ 
    echo $fetch['eventID']; 
} 

它会创建一个像foreach()但更简单的循环...

附:当你进行MySQL查询时,使用反引号[`]来确保该字符串不与MySQL函数(LIKE,SELECT等)混淆。

+0

哦,倒霉。你的意思是反引号? :P – Joe 2012-02-12 17:34:23

+0

@Joe是啊!抱歉!我在蒙特利尔,英语不是我的力量! – 2012-02-12 18:02:38

+1

这很好,你会找到一个不喜欢backtits的人:) – Joe 2012-02-12 18:06:40

3

更改表设置,为许多一对多设置(很多用户可以参加一个事件,一个用户可以参加许多活动) :

users 
- id (pk, ai) 
- name 
- embarrassing_personal_habits 

events 
- id (pk, ai) 
- location 
- start_time 

users_to_events 
- user_id ]-| 
      |- Joint pk 
- event id ]-| 

现在,你只需要使用联接:

SELECT u.* 
    FROM users u 
    JOIN users_to_events u2e 
    ON u.id = u2e.id 
    JOIN events e 
    ON u2e.event_id = e.id 
WHERE u.id = 11 
+0

我知道一些关于数据库规范化的知识,我只是不确定用什么命令来设置约束来修改现有的表。你能建议一个网站来阅读这个吗?感谢您的建议。 – user1104854 2012-02-12 05:45:38

2

我对你的描述有些困惑,但我认为问题在于mysql_fetch_array只是一次返​​回一行,而你的代码目前的设置方式似乎假设$fetch中充满了数组所有的结果。您需要持续致电mysql_fetch_array才能实现。

而不是

$fetch = mysql_fetch_array($myEvents); 
foreach($fetch as $eventsAttending){ 
      echo $eventsAttending['eventID']; 
      } 

你可以有

while ($row = mysql_fetch_array($myEvents)) { 
    echo $row['eventID']; 
} 

这将通过表中的事件的各种行周期。