0

我有一个这样用 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"
}

最好的方法是什么?

4

3 回答 3

2

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

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

您需要使用mysqli_PDO函数将参数绑定到您的查询(mysql_函数已被弃用。此外,使用列列表而不是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) . '}';

?>

编辑

按照您的原始代码,此解决方案应该可以工作:

$merkki = $_GET["merkki"];
$array = array();
// 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()); 
while($row = mysql_fetch_array($result)){
    $array[] = '"' . $row['id'] . '"' . ":" . '"' . $row['malli'] . '"';
}
echo '{' . implode(',', $array) . '}';
于 2012-10-15T23:38:23.263 回答
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
于 2012-10-15T23:36:35.257 回答
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 的信息。

于 2012-10-15T23:37:41.063 回答