![](/img/trans.png)
[英]Insert Multiple sql statements in php from an array from for loop or foreach
[英]Capturing/INSERT specific value from an input element added to a foreach loop that uses a SQL query array
所以,我一直在研究這個問題大約一個星期。 我發現了很多類似的問題,有類似this one或this one 的解決方案,但我對它們的運氣並不好。
我的問題是,我試圖從與 foreach 循環返回的結果相關聯的任何一個輸入元素中捕獲特定值。 像搜索引擎一樣,提交查詢,返回結果,每個結果都添加了一個“評級”滑塊,用戶應該能夠對任何結果進行評級並提交該結果的唯一評級。
我的“評級”范圍輸入對象:
<form action='#' method='POST'>
<input class='rating' type='range' name='rating_s' min='0' max='100' step='1' value='50' /></i>
<input class="rateglowbutton" type=submit value=Rate />
</form>
它位於 foreach 循環中(我知道,有很多用於格式化的回聲,就是這樣):
// array
$audios = $wpdb->get_results($wpdb->prepare("
SELECT a.aud_id
, a.date
, a.teacher
, a.title
, a.teach_desc
, a.venue
, a.genre
, a.url
, GROUP_CONCAT(t.tag_name SEPARATOR ', ') tag_name
FROM audio_tag_xref atx
RIGHT
JOIN audios a
ON atx.aud_id = a.aud_id
LEFT
JOIN audio_tags t
ON atx.tag_id = t.tag_id
WHERE (a.title LIKE '%$strKey%'
OR a.venue LIKE '%$strKey%'
OR a.teach_desc LIKE '%$strKey%'
OR a.genre LIKE '%$strKey%')
GROUP
BY a.aud_id
ORDER
BY a.aud_id DESC
",$strKey));
<?php echo "<table>"; ?>
<?php foreach($audios as $i => $audio){ ?>
<?php echo "<tr>";
echo "<tr><h3>".$audio->title."</h3></tr>";
echo "<tr>".$audio->url."</tr>";
echo "</br>";
echo "<tr>".$audio->aud_id."</tr>";
echo "</br>";
echo "<tr><b>".$audio->teacher."</b></tr>";
echo "</br>";
echo "<tr><i>".$audio->date."</i></tr>";
echo "  |  ";
echo "<tr><i>".$audio->venue."</i></tr>";
echo "</br>";
echo "<tr>".$audio->genre."</tr>";
echo "</br>";
echo "<tr>".$audio->teach_desc."</tr>";
echo "</tr>";
echo "</br>";
echo "</br>"; ?>
<form action='#' method='POST'>
<input class='rating' type='range' name='rating_s[]' min='0' max='100' step='1' value='50' />  <i class="fa fa-plus" aria-hidden="true"></i></div>
<input class="rateglowbutton" type=submit value=Rate />
</form>
<?php } ?>
<?php echo "</table>"; ?>
然后將提交的評分插入到我的數據庫中的評分表中:
<?php
if (isset($_POST['rating_s'])) {
$userid = md5($_SERVER['REMOTE_ADDR']);
$rate = $_POST['rating_s'];
$aud_id = "$audio->aud_id";
$sql = $wpdb->query($wpdb->prepare("INSERT INTO ratings (rate, aud_id, user_id) VALUES ('$rate', '$aud_id', '$userid')",$rate,$aud_id,$userid));
if ($sql) {
echo "</br>";
echo "<div class='rate_msg_cont'><div class='rate_msg'>You gave a rating of $rate for teaching ID: $aud_id.</div></div>";
}
}
?>
但是,我無法同時將費率和 aud_id 正確插入到評分表中。 充其量,我能夠獲得評級,但無法獲得它在頁面上“屬於”的 aud_id(為其各自返回的 $audio 結果呈現的輸入對象)。 我試圖遵循:
這是沒有在 foreach 中正確索引輸入元素的問題嗎? 也許是處理數組的問題? 完全是別的什么?
總結一下:我有一個搜索頁面,它使用輸入文本框供用戶輸入關鍵字字符串。 該字符串返回一個數組,foreach 循環使用該數組來輸出查詢結果,其中包括一個允許用戶對音頻進行評級的輸入對象。 可以很好地提交費率,但它們最終不會與用戶實際嘗試評價的結果音頻相關聯。
如何確保在對結果進行評級時,將評級和相應的 aud_id 作為新條目插入到評級表中?
視覺,如果有幫助:
非常感謝任何人的幫助。
首先從遠處看這個……我看到你在使用 PDO,但后來我看到你逃避了 PDO 的全部意義。
您不應該將您的值直接回顯到您的查詢字符串中...您應該綁定它們。
我只想給你一個小的 PDO 例子(與你的沒有特別的關系),這樣也許你可以用它作為指南來修復你自己的錯誤。
<table class="table table-bordered table-striped mb-none" id="datatable-editable">
<thead>
<tr>
<th>Accout Type | User's Name | Email Address</th>
<th></th>
</tr>
</thead>
<tbody id="tablebody">
<?
$DbHost = ""; // The host where the MySQL server resides
$DbDatabase = ""; // The database you are going to use
$DbUser = ""; // Username
$DbPassword = ""; // Password
// --- PDO Info
$dsn = 'mysql:host='.$DbHost.';dbname='.$DbDatabase;
$DbOptions = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$DBH = new PDO($dsn, $DbUser, $DbPassword, $DbOptions);
$qs = "SELECT * FROM `users` WHERE `accountid`=:accountid";
$q = $DBH->prepare($qs);
$q->bindValue(':accountid',(integer)$userrow['accountid'], PDO::PARAM_INT);
$q->execute();
while($row = $q->fetch(PDO::FETCH_ASSOC))
{
if($userrow['access'] >= $row['access'])
{
?>
<tr id="row<?=$row['id'];?>">
<?
$qs2 = "SELECT COUNT(*) AS `count` FROM `accounts` WHERE `admin` = :id";
$q2 = $DBH->prepare($qs2);
$q2->bindValue(':id', (integer)$row['id'], PDO::PARAM_INT);
$q2->execute();
$count = $q2->fetch(PDO::FETCH_ASSOC)['count'];
$isAdmin = 'false';
$fontStyle = " style='color:blue;'";
$userType = "Developer";
if($row['access'] == 40)$userType = "Accountant";
if($row['access'] == 60)$userType = "Administrator";
if($row['access'] == 99)$userType = "Internal Administrator";
if($row['access'] == 100)$userType = "Internal Developer";
$root = "<span class='label label-info'>$userType</span> ";
if($count > 0)
{
$isAdmin = 'true';
$fontStyle = " style='font-weight:bold;color:red;'";
$root = "<span class='label label-danger'>Root</span> ";
}
?>
<td><span style="color:red;"><?=$root;?></span><span<?=$fontStyle;?>><?=ucfirst(strtolower($row['firstname']))." ".ucfirst(strtolower($row['lastname']));?> - <?=$row['email'];?></span></td>
<?
if($count == 0)
{
?>
<td><a class="mb-xs mt-xs mr-xs" href="javascript:edit(<?=$row['id'];?>, '<?=$row['firstname'];?>', '<?=$row['lastname'];?>', '<?=$row['email'];?>', <?=$row['access'];?>, <?=$isAdmin;?>)">Edit</a></td>
<?
}
else
{
?><td>This account cannot be modified here.</td><?
}
?>
</tr>
<?
}
else
{
?>
<tr id="row<?=$row['id'];?>">
<?
$qs2 = "SELECT COUNT(*) AS `count` FROM `accounts` WHERE `admin` = :id";
$q2 = $DBH->prepare($qs2);
$q2->bindValue(':id', (integer)$row['id'], PDO::PARAM_INT);
$q2->execute();
$count = $q2->fetch(PDO::FETCH_ASSOC)['count'];
$isAdmin = 'false';
$fontStyle = " style='color:blue;'";
$root = "<span class='label label-info'>User Account</span> ";
if($count > 0)
{
$isAdmin = 'true';
$fontStyle = " style='font-weight:bold;color:red;'";
$root = "<span class='label label-danger'>Root Account</span> ";
}
?>
<td><span style="color:red;"><?=$root;?></span><span<?=$fontStyle;?>><?=ucfirst(strtolower($row['firstname']))." ".ucfirst(strtolower($row['lastname']));?> - <?=$row['email'];?></span></td>
<td>You do not have access to modify this account.</td>
</tr>
<?
}
}
?>
</tbody>
</table>
好的,感謝這里的每個人的幫助以及一些進一步的輸入/試驗和錯誤,我已經找到了一個解決方案。 我仍然會按照建議進行一些清理,但這里的想法和代碼使每個輸入元素都具有獨特的作用:
表單元素修改:
<?php echo " <form action='#' method='POST'>"; ?>
<?php echo " <input type='hidden' name='audio_index' value='" . $i . "' />"; ?>
<?php echo " <input type='hidden' name='audio_id' value='" .$teaching->aud_id. "' />"; ?>
<?php echo " <div class='range_container'>"; ?>
<?php echo " <div class='rate_sym'>"; ?>
<?php echo " <i class='fa fa-minus' aria-hidden='true'></i>  "; ?>
<?php echo " <input class='rating' type='range' name='rating_s' min='0' max='100' step='1' value='50' />  "; ?>
<?php echo " <i class='fa fa-plus' aria-hidden='true'></i>"; ?>
<?php echo " </div>"; ?>
<?php echo " </div>"; ?>
<?php echo " <div class='rate_container'>"; ?>
<?php echo " <div class='ratescr_container'></div>"; ?>
<?php echo " <input class='rateglowbutton' type='submit' value='Rate' />" ?>
<?php echo " </div>"; ?>
<?php echo " </form>"; ?>
echo " </td>";
echo " </tr>"; ?>
POST 代碼修改:
<?php
if (isset($_POST['rating_s']) && isset($_POST['audio_id'])) {
$table = "ratings";
$parama = $_POST['audio_id'];
$paramb = $_POST['rating_s'];
$paramc = md5($_SERVER['REMOTE_ADDR']);
$sql = $wpdb->query($wpdb->prepare("INSERT INTO $table (a_id, rating, u_id) VALUES ('$parama', '$paramb', '$paramc')"));
if (query) {
echo "</br>";
echo "<div class='rate_msg_cont'><div class='rate_msg'>Hooray! You rated
audio $parama a $paramb.</div></div>";
}
}
?>
請注意表單中的附加隱藏輸入元素,用於為返回的每個音頻生成索引,並為要使用的評級輸入生成“audio_id”。 同樣,我理解可以(將)實施的清理和安全改進,但我想將此作為工作解決方案發布給任何需要提示處理相同或類似問題的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.