繁体   English   中英

多个MySQL表加入PHP?

[英]Multiple mysql table joins with php?

老实说,我不知道该怎么做。 我在php和Mysql中都没有过分的经验,但是我正在尝试并可以使用一些帮助,最好是使用示例代码。

问题:我有3张桌子

  1. 会员
  2. customfields
  3. customvals

成员包含:

membername | Id

customfields包含:

rank | name

customvals包含

fieldid | userid | fieldvalue

表格列匹配于

customvals.userid=members.id
customvals.fieldid=members.rank

我需要做的是匹配数据,以便在调用page.php?user = membername时将其显示在页面上

Table1.membername:<br>
Table2.name[0] - Table3.fieldvalue[0]<br>
Table2.name[1] - Table3.fieldvalue[1]<br>
etc...

(显然只显示有关该会员名的信息)

该代码越有效,对我越有帮助。 请不要只发布内部连接语句。 如果您能解释您的解决方案的工作方式和原因,这对我也最有帮助

到目前为止,这是我要编写的代码:

$profileinfocall = "SELECT Table1.`membername`, Table2.`name`, Table3.`fieldvalue`
FROM members AS Table1
LEFT JOIN customvals AS Table3 ON Table1.`id` = Table3.`userid`
LEFT JOIN customfields AS Table2 ON Table3.`fieldid` = Table2.`rank`
WHERE Table1.`membername` = $username;";

$membercall = "SELECT * FROM members WHERE membername=$username";

$profileinfo = mysql_query($profileinfocall, $membercall);

while($row = mysql_fetch_array($profileinfo)) {
echo $row['membername'];
}

显然,这不起作用,因为出现以下错误:

警告:mysql_query()期望参数2为资源,第534行给出的字符串。

警告:mysql_fetch_array()期望参数1为资源,第535行给出空值

此SQL查询应执行以下操作:

SELECT a.membername, a.Id, b.fieldid, b.userid, b.fieldvalue, c.rank, c.name
FROM members AS a
LEFT JOIN customvals AS b ON a.id = b.userid
LEFT JOIN customfields AS c ON b.rank = c.fieldid
WHERE a.Id = #MEMBERIDHERE#;

尽管这是一个非常广泛的问题,并且您尚未提供任何PHP代码,但您可能希望将其分为以下几个部分:

建立与数据库的连接(使用mysqli)并发送查询:

$c = mysqli_connect("localhost","user","password","db");
if (mysqli_connect_errno())
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
else {
    $result = mysqli_query($c,"SELECT * FROM members");
    while($row = mysqli_fetch_assoc($result)) {
        echo "{$row['membername']}";
    }
}
mysqli_close($c);

将表捆绑在一起:

进入MySQL语法时,最好以清晰的结构(包括换行符)开始。 一种方法是拥有某种查询框架:

SELECT tablealias.column, table2alias.field3
FROM table AS tablealias
LEFT|RIGHT|INNER JOIN table2 AS table2alias ON table.id=table2.id
WHERE (this and that = true or false, LIKE and so on...)

将其分解为您的特定问题将是:

SELECT Table1.`membername`, Table2.`name`, Table3.`fieldvalue`
FROM members AS Table1
LEFT JOIN customvals AS Table3 ON Table1.`id` = Table3.`userid`
LEFT JOIN customfields AS Table2 ON Table3.`fieldid` = Table2.`rank`
WHERE Table1.`Id` = 'UserID to be searched for' 

改进和安全措施:

但是,它所具有的不仅仅是眼神。 如果您刚刚开始,那么不妨直接深入研究准备好的mysqli语句。 给定查询以获取您的成员,唯一改变的部分是ID。 这可以用于准备好的语句,该语句比我们的第一个查询要安全得多(尽管速度不快)。 考虑以下代码:

$sql =  "SELECT Table1.`membername`, Table2.`name`, Table3.`fieldvalue`
    FROM members AS Table1
    LEFT JOIN customvals AS Table3 ON Table1.`id` = Table3.`userid`
    LEFT JOIN customfields AS Table2 ON Table3.`fieldid` = Table2.`rank`
    WHERE (Table1.`Id` = ?)";
$c = mysqli_connect("localhost","user","password","db");
$stmt = $c->stmt_init();
if ($stmt->prepare($sql)) {
    $stmt->bind_params("i", $userid);
    $stmt->execute();
    while ($stmt->fetch()) {
        //do stuff with the data
    }
    $stmt->close();
}
$mysqli->close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM