从mysql中选择多个表中的数据?

时间:2017-05-26 12:19:36

标签: php mysql sql

我在数据库中有4个表,并且所有表中都有一个独特的clientid,但是rest字段不同。如果我们搜索任何客户端ID,我们如何从任何表中获取与搜索到的客户端ID相对应的信息。

$clientid=$_POST['client'];
$query = "SELECT * FROM 'pfs'
          JOIN 'pfssurety' 
          JOIN 'iso'
          JOIN 'incometax'
          WHERE clientid='$clientid'";
$result = mysql_query($query)or die (mysql_error());

while($row=mysql_fetch_array($result)) {
    echo $row['clientid'];
    echo $row['name'];
}

5 个答案:

答案 0 :(得分:1)

这是一个使用mysqli的实现,并防止注入$clientid,其中id为数字,然后为AUTO_INCREMENT列将永远不会有从0开始的0值

// as this is an int using inval will force it to be a valid whole number 
// basic SQL Injection Protection for a fixed id

$clientid = intval($_POST['client']);
if($clientid === 0){
    // it was not a valid number as an auto_increment field in mysql can never be 0
    die("invalid client");
}

$query="SELECT * FROM `pfs` 
    JOIN `pfssurety`  ON  pfssurety.clientid = pfs.clientid 
    JOIN `iso` ON  iso.clientid = pfs.clientid 
    JOIN `incometax` ON  incometax.clientid = pfs.clientid 
    WHERE pfs.clientid=$clientid";

$result= mysqi_query($query) or die("Query Failed");

while($row=mysql_fetch_array($result))
{
    echo $row['clientid'];
    echo $row['name'];
}

答案 1 :(得分:0)

你的意思是使用backtique而不是单引号。否则,您的表名称将被视为普通字符串文字。此外,您的所有ON条款都缺少JOIN条件,因此您的查询

SELECT * FROM 'pfs'

实际应该是

SELECT * FROM `pfs`

将您的查询更改为

SELECT * FROM `pfs`
JOIN `pfssurety` ON condition
JOIN `iso` ON condition
JOIN `incometax` ON condition
WHERE clientid='$clientid'

答案 2 :(得分:0)

使用JOIN,你在正确的轨道上。您需要指定应在其上进行JOIN的公共列。

https://www.w3schools.com/sql/sql_join_left.asp

SELECT a.fieldname, i.fieldname, t.fieldname, p.fieldname FROM 'pfs' as a
LEFT JOIN 'pfssurety' as p ON p.clientid  = a.clientid 
LEFT JOIN 'iso' as i ON i.clientid  = a.clientid 
LFT JOIN 'incometax' as t ON t.clientid  = a.clientid 
WHERE a.clientid='$clientid'";

此外,您应该转义变量以防止SQL注入。至少:

a.clientid= "' . mysqli_real_escape_string($clientid) . '"';

http://php.net/manual/en/mysqli.real-escape-string.php

答案 3 :(得分:0)

也许你需要在你的联接中设置如下:

SELECT * FROM 'pfs'
JOIN 'pfssurety'  ON pfs.clientid=pfssurety.clientid
JOIN 'iso' ON pfs.clientid=iso.clientid
JOIN 'incometax' ON pfs.clientid=incometax.clientid
WHERE clientid='$clientid'

Y表示所有表都具有clientid属性。

  • 您可以使用所需的不同属性的枚举
  • ,而不是使用SELECT *

答案 4 :(得分:0)

您的代码容易受到 SQL注入的攻击,您不应该直接在SQL查询中使用用户输入。在你的代码中,问题在于:

$clientid = $_POST['client']; // anyone could manipulate this field to inject malicious code
# ...
WHERE clientid='$clientid'";

检查$ _POST ['客户端']的值是:'或1 = 1 ;

接下来正如其中一条评论停止使用弃用的方法中所述,例如,您可以使用mysqli。下面是一个如何将mysqli与预准备语句一起使用以避免SQL注入的示例

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$stmt = $conn->prepare('SELECT * FROM `pfs` JOIN `pfssurety` ON condition JOIN `iso` ON condition JOIN `incometax` ON condition WHERE clientid = ?');

$stmt->bind_param('i', $clientid);
$stmt->execute();
$stmt->close();
$conn->close();
  

预准备语句是用于以高效率重复执行相同(或类似)SQL语句的功能。

     

与直接执行SQL语句相比,预准备语句有三个主要优点:

     
      
  • 准备语句减少了解析时间,因为查询的准备工作只进行一次(尽管语句多次执行)

  •   
  • 绑定参数可以最大限度地减少服务器的带宽,因为您每次只需要发送参数,而不是整个查询

  •   
  • 预准备语句对SQL注入非常有用,因为以后使用不同协议传输的参数值无需正确转义。如果原始语句模板不是从外部输入派生的,则不能进行SQL注入。

  •   

最后还有一件事值得一提,尽量不要使用*来获取所有列,而只是列出你需要获取的列。即使您需要获取所有列,也有充分的理由不使用*,而是列出所有列。