2015-09-02 1 views
0

Ok так вот таблицы у меня есть:1 из 3 выпадающих списка создает конфликт с использованием MySQL

departments           associates 
+--------+------------------+--------------+  +---------+------------------+-----------+------------+ 
| dep_id | dep_name   | date_added |  | asso_id | asso_name  | dep_id | date_added | 
+--------+------------------+--------------+  +---------+------------------+-----------+------------+ 
| 1  | Pick a Department| Date   |  | 1  | A Associate  | 2   | Date  | 
| 2  | Department A  | Date   |  | 2  | B Associate  | 3   | Date  | 
| 3  | Department B  | Date   |  | 3  | C Associate  | 4   | Date  | 
| 4  | Department C  | Date   |  | 4  | D Associate  | 5   | Date  | 
| 5  | Department D  | Date   |  | 5  | A Associate 2 | 2   | Date  | 
+--------+------------------+--------------+  +---------+------------------+-----------+------------+ 

key_list         key_log 
+--------+------------+--------------+  +------+--------------+------------+-------------+----------------+ 
| key_id | key_name | date_added |  | id | key_assigned | key_status | assigned_to | assigned_by | 
+--------+------------+--------------+  +------+--------------+------------+-------------+----------------+ 
| 1  | Key 1  | Date   |  | 1 | Key 1  | 0   | A Associate | logged in name | 
| 2  | Key 2  | Date   |  | 2 | Key 4  | 0   | B Associate | logged in name | 
| 3  | Key 3  | Date   |  |  |    |   |    |    | 
| 4  | Key 4  | Date   |  |  |    |   |    |    | 
| 5  | Key 5  | Date   |  |  |    |   |    |    | 
+--------+------------+--------------+  +------+--------------+------------+-------------+----------------+ 

Так что я пытаюсь создать ключевой журнал, в котором можно хранить имена ключей и ассоциированные имена и если ключ был выведен или включен. Моя первая проблема возникла при попытке связать выпадающие меню для отделов и партнеров. Я узнал, что вы не ставите комы для присоединений, и кто-то предложил просто пойти и использовать несколько запросов.
Таким образом, после некоторых исследований я пошел об этом так:

<?php 
$dbhost_name = "localhost"; 
$database = "db_name"; 
$username = "user_name";  
$password = "password"; 

try { 
$dbo = new PDO('mysql:host='.$dbhost_name.';dbname='.$database, $username, $password); 
} catch (PDOException $e) { 
print "Error!: " . $e->getMessage() . "<br/>"; 
die(); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
<script> 
function reload(form) 
{ 
var val=form.cat.options[form.cat.options.selectedIndex].value; 
self.location='dd.php?cat=' + val ; 
} 

</script> 
</head> 

<body> 

<?Php 

@$cat=$_GET['cat']; // Use this line or below line if register_global is off 
if(strlen($cat) > 0 and !is_numeric($cat)){ // to check if $cat is numeric data or not. 
echo "Data Error"; 
exit; 
} 
$quer3="SELECT DISTINCT key_name, key_id FROM key_iv order by key_name"; 

$quer2="SELECT DISTINCT category,cat_id FROM category order by category"; 

if(isset($cat) and strlen($cat) > 0){ 
$quer="SELECT DISTINCT subcategory FROM subcategory where cat_id=$cat order by subcategory"; 
}else{$quer="SELECT DISTINCT subcategory FROM subcategory order by subcategory"; } 

echo "<form method=post name=f1 action='dd-check.php'>"; 
    // Starting of first drop down 
echo "<select name=key_names><option value=''>Select Key</option>"; // list box select command 

foreach ($dbo->query($quer3) as $row){//Array or records stored in $row 

echo "<option value=$row[id]>$row[key_name]</option>"; 

/* Option values are added by looping through the array */ 

} 

echo "</select>";// Closing of list box 


echo "<select name='cat' onchange=\"reload(this.form)\"><option value=''>Select one</option>"; 
foreach ($dbo->query($quer2) as $noticia2) { 
if($noticia2['cat_id'][email protected]$cat){echo "<option selected value='$noticia2[cat_id]'>$noticia2[category]</option>"."<BR>";} 
else{echo "<option value='$noticia2[cat_id]'>$noticia2[category]</option>";} 
} 
echo "</select>"; 
// This will end the first drop down list 

//  Starting of second drop downlist 
echo "<select name='subcat'><option value=''>Select one</option>"; 
foreach ($dbo->query($quer) as $noticia) { 
echo "<option value='$noticia[subcategory]'>$noticia[subcategory]</option>"; 
} 
echo "</select>"; 
// This will end the second drop down list 

echo "<input type=submit value=Submit>"; 
echo "</form>"; 
?> 
</body> 
</html> 

Моя проблема состоит в том, что при выборе ключа, и после того, как выбрать отдел, ключ первоначально выбранный получает сброс, и вы должны вернуться и снова выберите ключ. Вы могли бы сказать o, просто поместите ключи в конец. Хорошо мое намерение позже будет иметь возможность выбрать ключ и с помощью ajax или php проверить, если статус ключа для этого ключа равен 0 (вышло из системы) или 1 (зарегистрировался), если он включен в состояние 0, автоматически выбирает переключатель для статуса 1 и наоборот.

После этого я сделал больше исследований и нашел этот Populate another select dropdown from database based on dropdown selection и поэтому решил пойти с этим подходом:

<?php 
$db = new mysqli('localhost', 'carlos', 'Security5', 'testing'); 
$query = "SELECT dep_id, dep_name FROM department"; 
    $result = $db->query($query); 

    while($row = $result->fetch_assoc()){ 
    $categories[] = array("id" => $row['dep_id'], "val" => $row['dep_name']); 
    } 

    $query = "SELECT ass_id, dep_id, ass_name FROM associates"; 
    $result = $db->query($query); 

    while($row = $result->fetch_assoc()){ 
    $subcats[$row['dep_id']][] = array("id" => $row['ass_id'], "val" => $row['ass_name']); 
    } 

    $jsonCats = json_encode($categories); 
    $jsonSubCats = json_encode($subcats); 


?> 
<!docytpe html> 
<html> 

    <head> 
    <script type='text/javascript'> 
     <?php 
     echo "var categories = $jsonCats; \n"; 
     echo "var subcats = $jsonSubCats; \n"; 
     ?> 
     function loadCategories(){ 
     var select = document.getElementById("categoriesSelect"); 
     select.onchange = updateSubCats; 
     for(var i = 0; i < categories.length; i++){ 
      select.options[i] = new Option(categories[i].val,categories[i].id);   
     } 
     } 
     function updateSubCats(){ 
     var catSelect = this; 
     var catid = this.value; 
     var subcatSelect = document.getElementById("subcatsSelect"); 
     subcatSelect.options.length = 0; //delete all options if any present 
     for(var i = 0; i < subcats[catid].length; i++){ 
      subcatSelect.options[i] = new Option(subcats[catid][i].val,subcats[catid][i].id); 
     } 
     } 
    </script> 

    </head> 

    <body onload='loadCategories()'> 
    <?php 
    $quer3="SELECT DISTINCT key_name, key_id FROM key_list order by key_name"; 
    echo "<select name=key_names><option value=''>Select Key</option>"; // list box select command 

foreach ($dbo->query($quer3) as $row){//Array or records stored in $row 

echo "<option value=$row[id]>$row[key_name]</option>"; 

/* Option values are added by looping through the array */ 

} 

echo "</select>";// Closing of list box 
?> 

    <select id='categoriesSelect'> 
    </select> 

    <select id='subcatsSelect'> 
    </select> 

    </body> 
</html> 

Проблема с этим еще раз, когда я помещаю первое падение вниз до двух других, с другой два не работают, и в этом случае полностью исчезают. Когда я размещаю его после двух выпадающих списков, все работает. Я знаю, почему я не помещаю его, чтобы исправить это. Как и раньше, мне нужно, чтобы это работало специально для добавления других функций позже. Чем и я отказываюсь признать, что это невозможно. Может ли кто-нибудь сказать мне, почему это не работает ни для одного из методов, и в этом отношении является лучшим методом.

+0

*** вы можете изменить свой пароль как можно скорее, Карлос, потому что вы случайно вставили его рядом в верхней части вашего второго примера :) Вероятно, вы должны выбрать более безопасный. https://pwqgen.herokuapp.com/ создает легко запоминающиеся и довольно безопасные пароли. *** –

+0

Спасибо @JonKloske Я сделаю это наверняка и спасибо за сайт. Я не слишком беспокоюсь об этом, так как я использую мам в своей локальной системе для тестирования. – REd808

ответ

0

Я думаю, что проблема с вашей второй попытки, вы получите KEY_NAME и KEY_ID из вашего запроса, но где вы выписывать значения в параметрах, которые относятся к KEY_NAME и идентификатор (не KEY_ID):

<?php 
    $quer3="SELECT DISTINCT key_name, key_id FROM key_list order by key_name"; 
    echo "<select name=key_names><option value=''>Select Key</option>"; // list box select command 
    foreach ($dbo->query($quer3) as $row){//Array or records stored in $row 
     echo "<option value=$row[id]>$row[key_name]</option>"; 
     /* Option values are added by looping through the array */ 
    } 
    echo "</select>";// Closing of list box 
?> 

Таким образом, фиксируя, что до (и отсутствие кавычек вокруг имен, а также отсутствие спасаясь данных на HTML):

<?php 
    $querykeys = "SELECT DISTINCT key_name, key_id FROM key_list order by key_name"; 
    printf("<select name='key_names'>\n"); 
    printf("<option value=''>Select Key</option>\n"); 
    foreach ($dbo->query($querykeys) as $row) { 
     printf("<option value='%s'>%s</option>", 
      htmlentities($row['key_id'], ENT_QUOTES), 
      htmlentities($row['key_name'], ENT_QUOTES) 
     ); 
    } 
    echo "</select>\n"; 
?> 
+0

Прошу прощения за последний ответ Джон, я изучал printf vs echo, и я изучал htmlentities и когда их использовать. Я использовал ваш ответ, и он работает. Я также выяснил, почему у моего второго подхода были проблемы, когда я положил его вниз. Как-то в моем запросе $ db было добавочное письмо, поэтому вместо $ db это было $ dbo, и это вызвало много путаницы. Во всяком случае, моя следующая миссия - создать запись для хранения информации каждый раз, когда ключ выйдет из системы в ассоциированную группу и проверяет, не вышел ли ключ. Благодарю. – REd808

+0

Не беспокойтесь, мы надеемся, что выше это помогло более широко, даже если исходная проблема была опечаткой! :) Повторите проверку - если вы не заботитесь об истории, просто иметь нулевое поле «checkedOutBy», вероятно, самый простой способ. Если вы заботитесь об истории, вы можете просто иметь другую таблицу с keyid, checkoutby, checkoutdate и checkindate. Чтобы проверить, доступен ли ключ, убедитесь, что в этой второй таблице нет записей с нулевым checkindate (что вы можете сделать с левым соединением, группой по keyid и SUM (chekindate IS NULL) AS выдающимся, а HAVING выдающимся = 0. –

Смежные вопросы