2015-04-18 1 views
0

Я пытаюсь получить несколько значений за пределами цикла while, чтобы использовать его в запросе за пределами цикла while. Теперь я могу получить только одно значение за раз. Значения, которые я пытаюсь получить, это один $ids=$row["curriculum_id"];Как получить несколько значений из цикла while для использования в запросе за пределами цикла?

Это мой код, любая помощь будет высоко оценена.

<?php 

    if(isset($_POST['Submit']) AND $_POST['Submit'] == 'Submit') 
    { 

    $coursneededdate =$_POST['needed']; 
$coursneededdate =mysqli_real_escape_string($mysqli,$coursneededdate); 
$gradunder=$_POST['gradunder']; 
$gradunder =mysqli_real_escape_string ($mysqli,$gradunder); 
$avalablesemster= $_POST['avalable']; 
$avalablesemster =mysqli_real_escape_string($mysqli,$avalablesemster); 

    $sql = "SELECT * FROM curriculum where '".$coursneededdate."' between startdate and enddate"; 
    $result = $mysqli->query($sql); 

    if ($result->num_rows > 0) { 
     while($row = $result->fetch_assoc()) { 
       $ids=$row["curriculum_id"]; 

     } 


    } 
    } 

    $result2 ="SELECT * FROM curriculumcourses INNER JOIN courses ON curriculumcourses.course_id = courses.course_id where curriculum_id='$ids' and semester_ava='$avalablesemster'"; 

    $result3 = $mysqli->query($result2); 
    if ($result3->num_rows > 0) { 
     while($row = $result3->fetch_assoc()) { 
    echo "<pre>"; 
    print_r($row); 


     } 

     } 

    ?> 

ответ

1

Это грубая версия (непроверенная). Этот код был инъекционным, я ввел mysqli_real_escape_string, http://php.net/manual/en/mysqli.real-escape-string.php. Рассмотрим использование подготовленных отчетов в будущем, How can I prevent SQL injection in PHP?.

<?php 
if(isset($_POST['Submit']) AND $_POST['Submit'] == 'Submit') { 
    $coursneededdate = isset($_POST['needed']) ? $mysqli->real_escape_string($_POST['needed']) : ''; 
    $gradunder=isset($_POST['gradunder']) ? $_POST['gradunder'] : ''; //this isn't used? 
    $avalablesemster= isset($_POST['avalable']) ? $mysqli->real_escape_string($_POST['avalable']) : ''; 
    $sql = "SELECT * FROM curriculum where '".$coursneededdate."' between startdate and enddate"; 
    $result = $mysqli->query($sql); 
    if ($result->num_rows > 0) { 
     $ids = ''; 
     while($row = $result->fetch_assoc()) { 
      $ids .= $mysqli->real_escape_string($row["curriculum_id"]) . ', '; 
     } 
     $ids = rtrim($ids, ', '); 
    } 
} 
$result2 ="SELECT * FROM curriculumcourses INNER JOIN courses ON curriculumcourses.course_id = courses.course_id where curriculum_id in($ids) and semester_ava='$avalablesemster'"; 
$result3 = $mysqli->query($result2); 
if ($result3->num_rows > 0) { 
    while($row = $result3->fetch_assoc()) { 
     echo "<pre>"; 
     print_r($row); 
     echo "</pre>"; 
    } 
} 
?> 

Этот код конкатенация всех ваши биографических идентификаторов в запятые, перечисленных в переменной ids. Затем эта переменная используется с функцией SQL in, которая будет искать все идентификаторы в этом списке. Вот 2 документа на эту тему https://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_inhttp://www.tutorialspoint.com/mysql/mysql-in-clause.htm.

+0

Большое спасибо @ chris85 Я ценю вашу помощь. Я редактировал свой пост, чтобы использовать real_escape_string. Об этом одном градиенте $. Я начну пытаться использовать его для фильтрации данных в зависимости от его значения. –

+0

Хорошо, не забудьте также избежать этого. Я не был уверен, что это было где-то использовано, поэтому я не избежал этого. – chris85

1

Вы можете заменить оба запроса на только один:

SELECT * FROM curriculumcourses 
    NATURAL JOIN courses 
    WHERE semester_ava='$avalablesemster' 
    AND curriculum_id IN (
     SELECT curriculum_id 
     FROM curriculum 
     WHERE '".$coursneededdate."' BETWEEN startdate AND enddate) 

И затем непосредственно получить результат от него.

Это решение быстрее, потому что СУБД оптимизирует запросы. Кроме того, опция query -> PHP -> query -> PHP сложнее отлаживать, читать и поддерживать (в дополнение к медленному).

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