2013-04-23 4 views
0

У меня есть форма с выбрать несколько, как это:Выбрать несколько (PHP и MySQL)

<select name="states[]" size="5" multiple> 
    <option value="2">state 1</option> 
    <option value="3">state 2</option> 
    <option value="4">state 3</option> 
    <option value="5">state 4</option> 
    <option value="6">state 5</option> 
</select> 

Я хочу, чтобы иметь возможность выбрать более одного состояния, а затем сделать запрос к базе данных и показать описание каждого выбранного состояния.

Так это то, что я должен сделать запрос с помощью PHP и MySQL:

$state = $_POST['states']; 
$data = mysql_query("SELECT * from states WHERE id_state = '$state'",$db); 

while($row = mysql_fetch_array($data)){ 
    $result=$row['description']; 
} 

echo $result; 

У меня есть этот код и он не показывает ничего.

Как исправить эту проблему?

+2

Ваш запрос MySQL является небезопасным. – Blender

+0

Начните использовать PDO для драйвера базы данных. Затем вы можете использовать 'var_dump ($ _ POST)', чтобы увидеть, как структура вашего входящего пост-массива. – Daniel

ответ

1

Это потребует простой foreach пройти через массив и получить результаты, основанные на каждую стоимости как таковые,

foreach($_POST['states'] as $state) { 
    $data = mysql_query("SELECT * from states WHERE id_state = '$state'",$db); 
    $row = mysql_fetch_array($data); 
    echo $row['description']; 
} 

Кроме того, так как вы не защищаете ваш запрос в каком-то и использует MySql который был устаревшим PHP 5.5.0, я предлагаю вам смотреть в PDO или Mysqli Подготовленные заявления

+0

Большое спасибо за ваш ответ, я сделал именно то, что вы мне сказали, и это сработало, я очень ценю вашу помощь, мне просто нужно добавить код if, если раньше этот код отображал ошибку. Но теперь я решаю это :) –

+0

Я рад, что мое решение отлично сработало для вас. –

0

вы могли бы построить строку итерируя через а rray:

$state = ""; 

foreach($_POST['states'] AS $s) 
{ 
    // Sanitize $s here 
    $state .= "`id_state` = " . $s . " OR"; 
} 

if($state) 
{ 
    $state = substr($state, 0, -3); 

    $data = mysql_query("SELECT * from states WHERE $state",$db); 

    while($row = mysql_fetch_array($data)){ 
     echo $row['description']; 
    } 
} 

Конечно, вы должны использовать что-то вроде MySQLi или PDO для обработки взаимодействия с базой данных. У них будут способы легко очищать вход, чтобы можно было избежать очевидных SQL injection.

Тамильский язык имеет довольно хороший метод выбора IN. Это всего лишь один вариант.

7

Попробуйте

$state = $_POST['states']; // return Array 
$count_states = count($state); 

if($count_states > 0) { 
    $states = implode(',', $state); 
    $data = mysql_query("SELECT * from states WHERE id_state IN ($states)",$db); 

    while($row = mysql_fetch_array($data)){ 
     echo $row['description']; 
    } 
} 
+0

Привет, Тамил, спасибо за ваш повтор, я попробовал то, что вы мне сказали, и это работает как-то. Когда я выбираю более одного варианта для выбора, я написал это, чтобы показать результаты: echo $ result; но он просто отображает последний вариант, который я выбираю. –

1

$_POST['states'] содержит массив со всеми идентификаторов выбранных состояний.

Конечно же вы можете запросить вашу базу данных для каждой публикуемой state_id, но способ лучше (и быстрее) было бы сделать запрос, который выглядит, как это и использует только один запрос:

SELECT description FROM states WHERE id_state=1 OR id_state=2 etc etc 

Это также может чтобы начать использовать слой абстракции базы данных, например PDO. Поскольку число отправленных состояний является переменной, мы должны сделать заявление также переменной:

// The [connection setup][2] by PDO is done in $conn, with some proper exception handlers 
// e.g. $conn = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 

// Fill an array with count() number of elements with value 'id_state=?' 
$place_holders = array_fill(0, count($_POST['state']), 'id_state= ?'); 

//implode the array 
$place_holders = implode(' OR ', $place_holders); 

// prepare the query 
$st = $conn->prepare("SELECT description FROM state WHERE $place_holders"); 

// execute to above prepared query with the $_POSTED states 
$st->execute($_POST['state']); 

// traverse the result 
foreach($st->fetchAll() AS $r){ 
    // do some magic 
} 
0
Example (pages for edit): 

//On select_multiple.php (Form): 

<?php 
//Conn 
include('incl_config.php'); 

//Multiple data to bring 
$sql = " select COD_DXS,VALOR_DXS from hc_dxsindromico where ESTADO_DXS='1' "; 
[email protected]_query($sql);  
?> 

//In the form select: 
<select multiple="multiple" size="7" name="dxsindromico[]"> //look yes or yes brackets [] 
    <option value="" selected="selected">Choose one or more options</option> 
     <?php 
     while($row=mysql_fetch_array($result)){ 
    ?> 
     <option value="<?php echo $row['COD_DXS']; ?>" style="color:#F00;"><?php echo $row['VALOR_DXS'];?></option> 
     <?php } ?> 
</select> 

//////////// On grabar_mtr.php /////////////// 

<?php 
include('incl_config.php'); 
/*Multiple selection form in HTML5, PHP and Bootstraps 
Created by: www.nycsoluciones.com 
Version: 1.1*/ 

//we use a foreach to traverse the array (values of our select and save them in the table dxsindromico_data) 

if(isset($_POST['dxsindromico'])){ 
    foreach($_POST['dxsindromico'] as $insertar) { 
     //echo $insertar; 
     $sqli="insert into dxsindromico_data(DXSINDROMICO_HC) values('$insertar')"; 
     //echo $sqli; 
     //exit; 
     $resulti=mysql_query($sqli); 
    } 
} else{ 
    foreach($_POST['dxsindromico'] as $insertar) { 
     //echo $insertar; 
     $sqli="insert into dxsindromico_data(DXSINDROMICO_HC) values('$insertar')"; 
     $resulti=mysql_query($sqli); 
    } 
} 
?> 
Смежные вопросы