PHP:用逗号分隔MySQL查询值

时间:2012-10-15 23:32:28

标签: php mysql sql

我有一个用PHP编写的MySQL查询:

$merkki = $_GET["merkki"];
// Retrieve all the data from the table 
//to show models based on selection of manufacturer

$result = mysql_query("SELECT * FROM Control_Mallit WHERE merkki_id = $merkki")
or die(mysql_error()); 
echo '{';
while($row = mysql_fetch_array($result)){
    echo '"' . $row['id'] . '"' . ":" . '"' . $row['malli'] . '"';
}
echo '}';

结果是正确的,但是如何在每条记录后得到一个逗号?如果我在每行之后回显(,)我的代码不起作用。我需要格式化如下所述。

{
    "":"--",
    "series-1":"1 series",
    "series-3":"3 series",
    "series-5":"5 series",
    "series-6":"6 series",
    "series-7":"7 series"
}

最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

立即停止使用您的代码。它易受SQL注入攻击。想想如果merkki的值是1 OR 1=1会发生什么。该声明将返回所有记录:

SELECT * FROM Control_Mallit WHERE merkki_id = 1 OR 1=1

您需要使用mysqli_PDO函数将参数绑定到您的查询(mysql_函数为being deprecated。另外,使用列列表而不是{{1 }。

以下是使用SELECT *(未经测试)的可能解决方案:

mysqli_

修改

按照原始代码,此解决方案应该有效:

<?php
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

/* check connection */
if (!$link) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$array = array();

/* create a prepared statement */
$stmt = mysqli_prepare($link, "SELECT id, malli FROM Control_Mallit WHERE merkki_id = ?");

/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, 'i', $_GET[merkki]);

/* execute query */
$result = mysqli_stmt_execute($stmt);

/* fetch associative array */
while ($row = mysqli_fetch_assoc($result)) {
    $array[] = '"' . $row['id'] . '"' . ":" . '"' . $row['malli'] . '"';
}

/* free result set */
mysqli_free_result($result);

/* close connection */
mysqli_close($link);

echo '{' . implode(',', $array) . '}';

?>

答案 1 :(得分:1)

我只是将所有内容都放在数组中并使用json_encode()输出它,例如

$data = array();
while ($row = mysql_fetch_array($result)) {
    $data[$row['id']] = $row['malli'];
}
echo json_encode($data);

这里的小例子 - http://codepad.viper-7.com/My27XJ

此外,您不应使用已弃用的mysql扩展程序。相反,我推荐PDO,例如

$db = new PDO(/* connection details */);
$stmt = $db->prepare('SELECT id, malli FROM Control_Mallit WHERE merkki_id = ?');
$stmt->bindParam(1, $_GET['merkki']);
$stmt->execute();

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // and so on

答案 2 :(得分:1)

尝试:

$merkki = $_GET["merkki"];
$merkki = mysql_real_escape_string($merkki);

// Retrieve all the data from the table to show models based on selection of manufacturer
$result = mysql_query("SELECT * FROM Control_Mallit WHERE merkki_id = $merkki")
or die(mysql_error());
$numRows = mysql_num_rows($result);
$row = 1;
echo '{';
while($row = mysql_fetch_array($result)){
    echo '"' . $row['id'] . '"' . ":" . '"' . $row['malli'] . '"';
    if ($row < $numRows) {
        echo ',';
    }
    $row++;
}
echo '}';

它只是使用行计数来确定它是否应该根据逗号是否在最后一个结果上来回显。

此外,请确保转义传递给mysql查询的任何输入,否则您很容易受到SQL注入攻击。请参阅将来切换到PDO或Mysqli。