【问题标题】:Display Each Row Where URL Variable Corresponds With Database ID显示 URL 变量与数据库 ID 对应的每一行
【发布时间】:2013-12-06 09:58:28
【问题描述】:

我有一个动态生成的 URL:

https://mywebsite.co.uk/report.php?taskid=25&rep=1&rep=2&rep=3

我可以检索任务 ID 和代表的变量:

if (isset($_GET['taskid'])) { $taskid = $_GET['taskid']; }
if (isset($_GET['rep'])) { $referenceID = $_GET['rep']; }

我要做的是在页面上创建一个 SQL 语句,该语句根据 URL 中的代表编号选择一行。例如:

SELECT TASK_ID, ID, NAME FROM mytable WHERE TASK_ID = $taskid AND ID = $referenceID

但是,当我回显 $referenceID 的结果时,它始终是最后一个代表,所以在这种情况下 3. 我如何从数据库中选择 ID = 1,2 & 3 的行?

然后我想显示每一行,所以它会是这样的:

<table>
$result = mysqli_query($con,"SELECT TASK_ID, ID, NAME FROM mytable WHERE TASK_ID = $taskid AND ID = $referenceID");
while($row = mysqli_fetch_array($result))
{
$ID = $row['ID'];
$NAME = $row['NAME'];
print "<tr><td>$ID</td><td>$NAME</td></tr>";
}
</table>

这个查询应该返回表中的 3 行,每行都有 ID AND NAME。

您的帮助将不胜感激。

【问题讨论】:

  • 为什么不用数组样式的 URL 参数?
  • 如果你使用相同的索引'rep',那么它每次都会覆盖并且只获取最后一个值...不要使用这个链接,建议使用POST方法
  • 你不能对不同的值使用相同的索引,每个参数必须有不同的索引

标签: php mysql sql


【解决方案1】:

首先,您需要将参数名称从 rep 更改为 rep[] 这将导致 PHP $_GET['rep'] 返回一个数组。

那么你需要对数组进行内爆,得到一个带逗号的字符串:

if (isset($_GET['rep'])) { 
    $referenceID = implode(',',$_GET['rep']); 
}

您必须将您的 SQL 语法更改为:

SELECT TASK_ID, ID, NAME FROM mytable WHERE TASK_ID = $taskid AND ID IN ($referenceID)

【讨论】:

  • 此方案存在SQL注入。你需要逃避代表,就像我的回答一样。
  • 字符串只有在你使用bind_param时才会被清理,如果你只是使用插值则不会。问题是bind_param在参数数量可变的情况下很难使用。
【解决方案2】:

试试这个查询

$result = mysqli_query($con,"SELECT TASK_ID, ID, NAME FROM mytable WHERE TASK_ID = $taskid AND (ID <= $referenceID and ID>= 1)");

【讨论】:

  • 如果 URL 中的 ID 不是从 1 到 3 的顺序怎么办?
【解决方案3】:

您应该使用数组样式的 URL 参数,例如

https://mywebsite.co.uk/report.php?taskid=25&rep%5B%5D=1&rep%5B%5D=2&rep%5B%5D=3

那么$_GET['rep']将是一个数组,你可以这样做:

$referenceIDs = implode(',', array_map(array($con, 'real_escape_string'), $_GET['rep']));
$sql = "SELECT TASK_ID, ID, NAME
        FROM mytable 
        WHERE TASK_ID = $taskid 
        AND ID IN ($referenceIDs)";

【讨论】:

  • 为什么没有人投反对票?是因为我使用了mysqli_real_escape_string 而不是参数化查询吗?参数个数不定时,参数很难做。
猜你喜欢
  • 2016-02-24
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多