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の値がだったらどうなるか考えてみてください1 OR 1=1。ステートメントはすべてのレコードを返します。

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

mysqli_または関数を使用してパラメータをクエリにバインドする必要がありますPDOmysql_関数は非推奨になっています。また、列リストを使用し、使用しないでください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 に答える