我在数据库中有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'];
}
答案 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) . '"';
答案 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属性。
答案 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注入。
最后还有一件事值得一提,尽量不要使用*来获取所有列,而只是列出你需要获取的列。即使您需要获取所有列,也有充分的理由不使用*,而是列出所有列。