2014-01-02 2 views
0

Вечер всем, у меня есть страница, которая обновляет таблицу/строку таблицы mysql, используя форму. Когда вы переходите на страницу xyz.php, выпадающий список. Выбрав artID из выпадающего списка и нажав submit, отобразится форма. Форма предварительно заполняется с помощью artId и сопоставляется с запросом mysql, который извлекается из начала скрипта. Код ниже работает отлично.Заполнить форму из выпадающего меню с помощью mysql более эффективно

Мой вопрос, однако, может ли это быть более эффективным? В частности, предварительно заполненная форма. Я использую оператор if, чтобы найти индекс массива, в который вложен «artId». Затем с помощью vars индексированного массива заполнить форму. Эти швы были бы довольно обременены, если запрос sql большой.

Я также использую конструкции 2 foreach для тех же данных. Я все еще работаю над тем, как устранить одну из них, не разбирая всю форму.

Любые предложения или мысли для направления, которым нужно руководствоваться, очень ценятся, как всегда. Благодаря JR

$sqllst = "SELECT artId, artName, artSummary, artContent FROM article"; 

    $dba = new PDO($dsn, $usr, $pas); 
    $dba->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $getlist = $dba->prepare($sqllst); 
    $getlist->execute(); 
    $res = $getlist->fetchAll(); 

    if ($_SERVER['REQUEST_METHOD'] != 'POST') { 

     echo '<form method="post"> 
       <select name="dro">'; 

      foreach ($res as $red){ 
       echo '<option name="dro" value=' . $red['artId'] . '>ID# ' .$red['artId'] . '-' . $red['artName'] . '</option>'; 
      } 

     echo '</select> 
       <input type="submit" value="Select Article"> 
       </form>'; 
    } else { 

      $arrayIndex = $_POST ['dro']; 

      foreach ($res AS $searchValue) { 
       if ($searchValue['artId'] == $arrayIndex) { 
        $name = $searchValue['artName']; 
        $sumry = $searchValue['artSummary']; 
        $cont = $searchValue['artContent']; 
       } 
      } 
      echo "<form method=post id=setArticle> 
        Article Id: <input type=text name=id value=" . $arrayIndex . "><br> 
        Article Name: <input type=text name=name value=" . $name . "><br> 
        Article Summary: <input type=text name=sum value=" . $sumry . "><br> 
        Article Content: <textarea name=content rows=4 cols=10>" . $cont . " </textarea><br> 
        <input type=submit value=SUBMIT>  
       </form>"; 
    } 

ответ

0

Ваш else заявление довольно странно. Почему нет параметризованного запроса? Foreach заявление бесполезно, если вы используете что-то вроде этого:

$sth = $dba->prepare('SELECT artId, artName, artSummary, artContent FROM article WHERE artId = :id'); 
$sth->bindValue(':id', $_POST ['dro'], PDO::PARAM_INT); 
$sth->execute(); 

Prepare заявление, чтобы избежать инъекции SQL.

Так что теперь это должно выглядеть так:

$sqllst = "SELECT artId, artName, artSummary, artContent FROM article"; 

$dba = new PDO($dsn, $usr, $pas); 
$dba->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

if ($_SERVER['REQUEST_METHOD'] != 'POST') { 

    $getlist = $dba->prepare($sqllst); 
    $getlist->execute(); 
    $res = $getlist->fetchAll(); 

    echo '<form method="post"> 
      <select name="dro">'; 

     foreach ($res as $red){ 
      echo '<option name="dro" value=' . $red['artId'] . '>ID# ' .$red['artId'] . '-' . $red['artName'] . '</option>'; 
     } 

    echo '</select> 
      <input type="submit" value="Select Article"> 
      </form>'; 
} else { 

    $sth = $dba->prepare('SELECT artId, artName, artSummary, artContent FROM article WHERE artId = :id'); 
    $sth->bindValue(':id', $_POST ['dro'], PDO::PARAM_INT); 
    $sth->execute(); 

    $result = $sth->fetch(PDO::FETCH_ASSOC); 
//Please remember to purify everything which is provided by users 
     echo "<form method=post id=setArticle> 
       Article Id: <input type=text name=id value=" . $result['artId']. "><br> 
       Article Name: <input type=text name=name value=" . $result['artName']. "><br> 
       Article Summary: <input type=text name=sum value=" . $result['artSummary']. "><br> 
       Article Content: <textarea name=content rows=4 cols=10>" . $result['artContent']. " </textarea><br> 
       <input type=submit value=SUBMIT>  
      </form>"; 
} 

O Конечно, следующий шаг, чтобы отделить представление от контроллера. Это выглядит очень уродливо, когда все в одном файле.

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