PHP PDO将行的id传递给url

时间:2015-08-07 10:41:38

标签: php mysql pdo

我需要帮助!对于我的生活,我无法弄清楚我做错了什么......我试图建立一个简单的搜索脚本,从mysql数据库返回一些结果,并从我想要的那些结果能够点击每一个并将其传递到新页面,让我们说results.php,其中加载了该结果的详细信息,类似于我想的电子商务网站,其中显示了产品的结果,以及点击了一,该产品及其附加细节将加载到新页面中。我知道我需要将id传递给url,但我不断得到的问题是它只是将搜索结果中的最后一个id传递给url ...但是在搜索中收集所有正确的id#s结果...

我是非常新的php pdo等。我试图在网上找到一个解决方案,花了几天看,但我要么得到相同的结果,或者我得到和错误,这表明我没做对了..无论如何,这是我到目前为止所做的:

<?php

require('inc/connect/config.php');

$output = "";

if(!isset($_POST['search'])) {
$output = "";
}
if(isset($_POST['search'])) {
$search_query = $_POST['search'];
$search_query = preg_replace("#[^0-9a-z]#i", "", $search_query);

try {
    $query = $db->prepare('SELECT * FROM clients WHERE name LIKE "%' . $search_query . '%" OR town LIKE "%' . $search_query . '%"');
    $query->execute();

    while($r = $query->fetch(PDO::FETCH_ASSOC)) {
        $bname = $r['name'];
        $btown = $r['town'];
        $id = $r['id'];

        $output .= $bname . '<br>' . $btown . '<br>' . $id . '<br><br>';
    }
    if($query->rowCount() < 1) {
        $output = "no results found";
    }

} catch (PDOException $e) {
    echo "failed search";
}
}

?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>search</title>
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div style="padding: 20%; text-align: center;">
    <h3>search</h3>
    <p>or search by <a href="categories.php">category</a></p><br>

    <form method="post" action="search-test.php">
        <label>&lt;3 </label><input type="text" name="search" id="search" placeholder="search by brand or town..." style="width: 40%;"><br><br>
        <input type="submit" value="search">
    </form>
    <br>
    <a href="results.php?id=<?php echo $id; ?>"><?php echo $output; ?></a>
</div>


</body>

</html>

执行搜索时,返回的结果如下:

业务1

1

业务2

2

business3

3

但是对于url链接到results.php页面,它会为每个结果分配id为3 ...它只会将结果集中的最后一个id传递给url ...我做错了什么?请帮助!!

提前致谢

3 个答案:

答案 0 :(得分:2)

每次你转到while循环时都会重写

$ id。所以,它的最终结果是你的最后一个id,这是真的。

您的第一选择是将SQL结果存储到数组中,然后在视图上循环它。您的第二选择如下:

替换:

$.ajax({
    url: "/questions/" + _questionId + "/answers/" + answerId + "/edit",
    method: "put",
    headers: { "${_csrf.parameterName}": "${_csrf.token}" },
    data: {
        id : answerId,
        body : body,
    }
});

通过:

$output .= $bname . '<br>' . $btown . '<br>' . $id . '<br><br>';

并且:

$output .= "<a href=\"results.php?id=$id\">".$bname . '<br>' . $btown . '<br>' . $id . '</a><br><br>';

通过:

<a href="results.php?id=<?php echo $id; ?>"><?php echo $output; ?></a>

答案 1 :(得分:1)

首先,我建议您重构一下当前代码,即如何准备语句。您应该将这些参数抽象为params方法,而不是将参数直接包含在prepare语句中;如果不这样做,就会失去准备语句的目的,并打开SQL注入!

$query = $db->prepare('SELECT * FROM clients WHERE name LIKE :query OR town LIKE :query');
$params = array(':query' => '%' . $search_query . '%');
$query->execute($params);

其次,PHP PDO有一个fetchAll方法可以迭代,而不是多次调用fetch

$results = $query->fetchAll(PDO::FETCH_ASSOC);
if(count($results) < 1) {
    $output = "no results found";
}
else {
    for($results as $r) {
        $bname = $r['name'];
        $btown = $r['town'];
        $id = $r['id'];

        $output .= $bname . '<br>' . $btown . '<br>' . $id . '<br><br>';
    }
}

最后,要回答您的错误:每次进行while循环时都会重置$id,并以值3退出。然后,您将内容直接输出到HTML,因此只需使用$id的当前值(链接将包含所有内容,而不是单独包含每个结果)。相反,我建议您将链接标记添加到循环中,以便为每个结果创建单独的链接:

$output .= '<a href="results.php?id=' . $id . '">' . $bname . '<br>' . $btown . '<br>' . $id . '<br><br></a>';

然后只需通过<?php echo $output; ?>

输出到HTML 祝你好运!

答案 2 :(得分:0)

结果页面的链接为if(s != null){ if (s.length() > 0) totalPriceEdit.setText(String.valueOf(qty * unitPrice)); } } <a href="results.php?id=<?php echo $id; ?>">具有存在$id循环时的值。

在循环中,您应该为每个结果生成一个链接,或者将您传递给结果页面的while参数中的所有ID连接起来,例如:ids