2013-09-11 4 views
0

Я разрабатывал поле для редактирования своего сайта, где пользователи могут иметь множество цен для разных «пакетов» определенного продукта. Я хочу, чтобы пользователи могли заказывать пакеты в любом порядке. Поэтому я перечисляю продукты, используя счетчик (эти ИИ по таблице цен). Если кто-то скажет мне, что я делаю это глупо, и сообщите мне о гораздо лучшем дизайне, я был бы признателен.Лучший способ ввода динамических полей?

<?php 
    $UserID = mysqli_real_escape_string($connection, $_SESSION['userID']); 
    $PID = mysqli_real_escape_string($connection, $_SESSION['ePID']); 
    $findpricesstmt = mysqli_prepare($connection, "SELECT * FROM products WHERE UserID = ? and PID= ?"); 
    mysqli_stmt_bind_param($findpricesstmt, 'ii', $UserID, $PID); 
    mysqli_stmt_execute($findpricesstmt); 
    $findpricesresult = mysqli_stmt_get_result($findpricesstmt); 
    $findpricesrow = mysqli_fetch_assoc($findpricesresult); 
    if(mysqli_num_rows($findpricesresult) == 0) { 
     echo('You currently have no prices for this product, meaning it is deactivated. To continue sales, add a price and click reactivate.'); 
    } 
    else{ 
     $_SESSION['count'] = 50; 
     while($_SESSION['count'] > 0) 
     { 
      $count = mysqli_real_escape_string($connection, $_SESSION['count']); 
      $count1stmt = mysqli_prepare($connection, "SELECT * FROM prices WHERE Count = ? and UserID = ? and PID= ?"); 
      mysqli_stmt_bind_param($count1stmt, 'iii', $count, $UserID, $PID); 
      mysqli_stmt_execute($count1stmt); 
      $count1result = mysqli_stmt_get_result($count1stmt); 
      if(mysqli_num_rows($count1result) != 0) { 
       include '../includes/orderpackmanu.php'; 
      } 
      $_SESSION['count']--; 
     } 
    } 
?> 

В orderpackmanu.php, у меня есть:

<?php 
$count = mysqli_real_escape_string($connection, $_SESSION['count']); 

$displayprimanustmt = mysqli_prepare($connection, "SELECT * FROM prices WHERE Count = ?"); 
mysqli_stmt_bind_param($displayprimanustmt, 'i', $count); 
mysqli_stmt_execute($displayprimanustmt); 
$displayprimanuresult = mysqli_stmt_get_result($displayprimanustmt); 

if(mysqli_num_rows($displayprimanuresult) != 0) { 
    $displayprimanurow = mysqli_fetch_assoc($displayprimanuresult); 
    $price = $displayprimanurow['price']; 
    $units = $displayprimanurow['units']; 
    $ppu = $displayprimanurow['ppu']; 
    $dispcode = $displayprimanurow['dispcode']; 
} 
?> 
<div> 
    <div style="width:55%;float:left;text-align:center;"> 
     <?php if(isset($price)){ echo $price . "$ for "; } if(isset($units)){ echo $units; } ?> 
     <br> 
     <?php if(isset($ppu)){ echo $ppu . "$ per unit"; } ?> 
    </div> 
    <div style="width:40%;float:left;"> 
     <input class="orderinput" type="text" name="<?php if(isset($count)){ echo $count; } ?>" placeholder="<?php if(isset($dispcode)){ echo $dispcode; } ?>" maxlength="30"> 
    </div> 
    <div style="clear:both;"></div> 
    <br> 
</div> 

Мой вопрос конкретно о вводе имени (хотя любое «общее» решение этой конструкции также является приемлемым). Если я пойду с этим форматом, и у каждого входа есть собственное имя dispcode для имени, есть ли простой способ сделать процесс ввода? Или кто-нибудь скажет мне, почему то, что я делаю, в корне неверно, и как это исправить.

+0

Первое, что привлекло мое внимание, НЕ сочетает 'escape_string' с' bind_param'. Весь смысл 'bind_param' заключается в том, чтобы устранить необходимость в escape-строке: данные обрабатываются как данные, а не часть строки запроса. – Passerby

+0

@Passerby Какая причина не использовать их обоих? Даже если это повторяется. –

+0

Они не «повторяющиеся»; Это разные вещи. Предположим, что вы хотите вывести '' WTF'', в традиционном стиле escape, вы делаете 'SELECT '(escape ("' WTF '')) '; ', которые заканчиваются' SELECT' '' WTF '' '; '; но в стиле привязки вы делаете SELECT?; bind ("WTF '"); ', к которому БД анализируется как:' SELECT?', где ** данные ** '' '' 'WTF''. Если вы объедините их, БД будет анализироваться как 'SELECT?', Где данные '?' Есть '' '' WTF '' ''. – Passerby

ответ

0

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

$x = 1; 
while(isset($_POST[$x])){ 
//input 
$x++; 
} 

Это не работает, потому что переменные поля не могут начинаться с цифр. Это делает работу:

$count; 
$x = 'X'.$count; 
while(isset($_POST[$x])){ 
//input 
$count++; 
$x = 'X'.$count; 
} 

Сейчас все еще существуют проблемы с ним, но это был самый большой/наиболее запутанных/легче всего объяснить, что я узнал, делая это. В любом случае я меняю свой код, просто вернусь и отвечу на вопросы, которые я задал с вещами, которые я узнал.

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