динамически — как динамически выводить несколько результатов из переменных php $ _GET

У меня есть следующий код, который динамически отображает таблицу на основе того, что в базе данных:

$sql = "SELECT * from users WHERE pin = '" . mysqli_real_escape_string($link, $_SESSION['pin']) . "' ";
$result = mysqli_query($link,$sql) or die("bad query: $sql");

echo"<form method='GET' name='confirm-attending-form'><table border='1'>";
echo"<tr><th>id</th><th>Firstname</th><th>Surname</th><th>Invite Type</th><th>Attending?</th></tr>";

while($row = mysqli_fetch_assoc($result)) {
echo"<tr>
<td>{$row['id']}</td>
<td>{$row['forename']}</td>
<td>{$row['surname']}</td>
<td>{$row['invite_type']}</td>
<td><select name='attending'>
<option value='0'>No</option>
<option  value='1'>Yes</option>
</select>
</td>
</tr>";
}
echo"</table><input type='submit' name='submit' value='Get Selected Values'/></form>";

Я хочу вывести значения переменной $ _GET [‘Participating’] из разных строк таблицы. Код, который я имею ниже, только распечатывает последнюю строку.

if(isset($_GET['submit'])){
$attending_val = $_GET['attending'];  // Storing Selected Value In Variable
echo "You have selected :" .$attending_val;  // Displaying attending Value

} else {

echo "Error";

};

Любая помощь / идеи, которые у вас есть, ребята, были бы великолепны.

-2

Решение

Общие предложения:

  • Старайтесь по возможности избегать создания HTML-кода из php.
  • Не путайте операторы доступа к БД с кодами создания HTML (как вы это делали с while петля и mysqli_fetch_assoc функция). Лучше сохранить результаты выборки из базы данных в массив и использовать только этот массив для повторного просмотра его элементов позже, в части HTML-кодов.
  • Вы пытаетесь избежать внедрения SQL, применяя экранирование, предоставленное mysqli_real_escape_string, с последующим mysqli_query, Я настоятельно рекомендую вам забыть обе функции с этого момента. Сделай себе привычку от использования готовые заявления вместо. С подготовленными заявлениями вы достигнете полного избежания впрыск sql — если правильно применяется. Смотрите также эта почта если хочешь.
  • Попробуйте использовать объектно-ориентированную библиотеку MySQLi вместо процедурной (см. Мой код). В документах php.net MySQLi каждой процедурной функции соответствует объектно-ориентированный стиль.
  • Вы должны избегать проверок, таких как or die(...), Вы можете отлавливать и обрабатывать любые виды ошибок / исключений / предупреждений / уведомлений / и т. Д. (Например, сбой соединения с БД, неправильный синтаксис sql, неопределенный индекс, сбой выборки данных и т. Д.) С помощью более элегантное решение. А также Вот, в отношении MySQLi.

Вернуться к вашему коду:

  • Ниже я написал решение в надежде, что оно поможет вам по-новому взглянуть на всю структуру кода и связанные с ним «операции». Там действительно много комментариев, но я думаю, вы найдете их полезными.
  • Метод HTTP GET не является жизнеспособным решением в контексте вашей задачи (даже для целей тестирования). Вы должны придерживаться метода POST от начала до конца и найти другие способы тестирования.
  • В общем, если вам нужен столбец «ID» в таблицах, не показывайте его пользователям вашего сайта. Скрыть. Даже тогда вы все равно сможете получить доступ к значению идентификатора каждой записи.
  • @Mahesh и @Tenflex уже предоставили вам хорошие решения относительно ценностей attending ComboBoxes. Лично я использовал немного другой подход: скрытые входные данные для значений столбца «ID» и атрибута name="attending[]" за каждого присутствующего комбобокса. Таким образом, после подачи вы поймаете два массива (см. $ids а также $attendings), в котором каждый элемент соответствует опубликованному идентификатору пользователя, соответственно. пользователю, обслуживающему стоимость. Вы также можете увидеть на экране полученные массивы после отправки, потому что я реализовал 2-3 строки кода тестирования (поиск @todo в моих кодах и действуй соответственно).
  • Избегайте использования устаревших или более не поддерживаемых атрибутов в HTML-коде (например, border='1', что не поддерживается в HTML5) и избегать использования встроенных стилей CSS. В обеих ситуациях присваивайте классы CSS элементам HTML и настраивайте их соответственно в CSS.
  • Вы можете скопировать / вставить / запустить мой код как есть. Просто создайте две страницы и запустите, чтобы увидеть, как это работает. Не забудьте изменить значения параметров подключения к БД.
  • я использовал $connection вместо $link,
  • Снова: прочитайте статьи относительно сообщения об ошибках / исключениях и подготовленных утверждениях.

Удачи.

П.С .: Если вы заботитесь об элегантности кода и лучшем доступе к данным, не стесняйтесь использовать PDO вместо MySQLi. Во многих отношениях они очень похожи, хотя PDO — идеальный выбор.


connection.php

<?php

// Db configs.
define('HOST', 'localhost');
define('PORT', 3306);
define('DATABASE', 'yourdb');
define('USERNAME', 'youruser');
define('PASSWORD', 'yourpass');

/*
* Enable internal report functions. This enables the exception handling,
* e.g. mysqli will not throw PHP warnings anymore, but mysqli exceptions
* (mysqli_sql_exception).
*
* MYSQLI_REPORT_ERROR: Report errors from mysqli function calls.
* MYSQLI_REPORT_STRICT: Throw a mysqli_sql_exception for errors instead of warnings.
*
* @link http://php.net/manual/en/class.mysqli-driver.php
* @link http://php.net/manual/en/mysqli-driver.report-mode.php
* @link http://php.net/manual/en/mysqli.constants.php
*/
$mysqliDriver = new mysqli_driver();
$mysqliDriver->report_mode = (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

/*
* Create a new db connection.
*
* @see http://php.net/manual/en/mysqli.construct.php
*/
$connection = new mysqli(HOST, USERNAME, PASSWORD, DATABASE, PORT);

users.php

<?php
require 'connection.php';

/*
* Perform operations upon form submission.
*/
if (isset($_POST['submit'])) {
$ids = $_POST['ids'];
$attendings = $_POST['attending'];

/*
* Just for testing the results.
* @todo Delete the two lines below.
*/
echo '<pre>User ids: ' . print_r($ids, TRUE) . '</pre>';
echo '<pre>Attendings: ' . print_r($attendings, TRUE) . '</pre>';

$messages[] = 'The third user has the user id ' . $ids[2] . ' and the attending ' . $attendings[2] . '.';
}

/*
* Just for testing.
* @todo Delete the line below.
*/
$_SESSION['pin'] = 12;

// Get the pin.
$pin = $_SESSION['pin'];

/*
* The SQL statement to be prepared. Notice the so-called markers,
* e.g. the "?" signs. They will be replaced later with the
* corresponding values when using mysqli_stmt::bind_param.
*
* @link http://php.net/manual/en/mysqli.prepare.php
*/
$sql = 'SELECT *
FROM users
WHERE pin = ?';

/*
* Prepare the SQL statement for execution.
*
* @link http://php.net/manual/en/mysqli.prepare.php
*/
$statement = $connection->prepare($sql);

/*
* Bind variables for the parameter markers (?) in the
* SQL statement that was passed to prepare(). The first
* argument of bind_param() is a string that contains one
* or more characters which specify the types for the
* corresponding bind variables.
*
* @link http://php.net/manual/en/mysqli-stmt.bind-param.php
*/
$statement->bind_param('i', $pin);

/*
* Execute the prepared SQL statement.
* When executed any parameter markers in the sql statement will
* automatically be replaced with the appropriate data.
*
* @link http://php.net/manual/en/mysqli-stmt.execute.php
*/
$statement->execute();

/*
* Get the result set from the prepared statement.
*
* NOTA BENE:
* Available only with mysqlnd ("MySQL Native Driver")! If this
* is not installed, then uncomment "extension=php_mysqli_mysqlnd.dll" in
* PHP config file (php.ini) and restart web server (I assume Apache) and
* mysql service. Or use the following functions instead:
* mysqli_stmt::store_result + mysqli_stmt::bind_result + mysqli_stmt::fetch.
*
* @link http://php.net/manual/en/mysqli-stmt.get-result.php
* @link https://stackoverflow.com/questions/8321096/call-to-undefined-method-mysqli-stmtget-result
*/
$result = $statement->get_result();

/*
* Fetch the data and save it into an array.
*
* @link http://php.net/manual/en/mysqli-result.fetch-all.php
*/
$users = $result->fetch_all(MYSQLI_ASSOC);

/*
* Free the memory associated with the result. You should
* always free your result when it is not needed anymore.
*
* @link http://php.net/manual/en/mysqli-result.free.php
*/
$result->close();

/*
* Close the prepared statement. It also deallocates the statement handle.
* If the statement has pending or unread results, it cancels them
* so that the next query can be executed.
*
* @link http://php.net/manual/en/mysqli-stmt.close.php
*/
$statement->close();

/*
* Close the previously opened database connection.
* Not really needed, because php automatically closes all connections
* when the script processing finishes.
*
* @link http://php.net/manual/en/mysqli.close.php
*/
$connection->close();
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
<meta charset="UTF-8" />
<!-- The above 3 meta tags must come first in the head -->

<title>Demo</title>

<style type="text/css">
body { padding: 30px; }
button { margin-top: 20px; padding: 7px 12px; background-color: #8daf15; color: #fff; border: none; }
.messages { margin-bottom: 20px; }
.users { border-collapse: separate; border: 1px solid #ccc; }
.users thead th { padding: 10px; background-color: #f3f3f3; }
.users tbody td { padding: 5px; }
.idColumn { display: none; }
</style>
</head>
<body>

<h4>Users list</h4>

<div class="messages">
<?php
if (isset($messages)) {
echo implode('<br/>', $messages);
}
?>
</div>

<form name="confirm-attending-form" action="" method="post">
<table class="users">
<thead>
<tr>
<th class="idColumn">ID</th>
<th>First Name</th>
<th>Surname</th>
<th>Invite Type</th>
<th>Attend?</th>
</tr>
</thead>
<tbody>
<?php
if ($users) {
foreach ($users as $user) {
$id = $user['id'];
$firstName = $user['forename'];
$surname = $user['surname'];
$inviteType = $user['invite_type'];
?>
<tr class="user">
<td class="idColumn">
<input type="hidden" id="userId<?php echo $id; ?>" name="ids[]" value="<?php echo $id; ?>" />
</td>
<td>
<a href="javascript:alert('Do something with this row. User id: <?php echo $id; ?>');">
<?php echo $firstName; ?>
</a>
</td>
<td>
<?php echo $surname; ?>
</td>
<td>
<?php echo $inviteType; ?>
</td>
<td>
<select name="attending[]">
<option value="0">No</option>
<option value="1">Yes</option>
</select>
</td>
</tr>
<?php
}
} else {
?>
<tr>
<td colspan="5">
<?php echo 'No users found'; ?>
</td>
</tr>
<?php
}
?>
</tbody>
</table>

<button type="submit" id="submit" name="submit" value="submit">
Submit
</button>
</form>

</body>
</html>

Используемая структура таблицы:

CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`pin` int(11) DEFAULT NULL,
`forename` varchar(100) DEFAULT NULL,
`surname` varchar(100) DEFAULT NULL,
`invite_type` int(11) DEFAULT NULL,
`attending` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1

Другие решения

Я думаю, что было бы полезно также собрать идентификатор участников вместо получения списка «1».
Используйте POST вместо GET тоже.
Публикация в виде массива путем присвоения [] имени тега select.

<td>
<select name='attending[]'>
<option value='0'>No</option>
<option  value='{$row["id"]}'>Yes</option>
</select>
</td>

тогда в PHP запустить

if(isset($_POST['attending'])){
$attending_val = $_POST['attending'];  // Storing Selected Values In Variable
echo "You have selected :" .implode ( ", " , $attending_val );  // Displaying list of attending ID's

} else {
echo "Error";
};
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector