簡體   English   中英

從添加到使用 SQL 查詢數組的 foreach 循環的輸入元素中捕獲/插入特定值

[英]Capturing/INSERT specific value from an input element added to a foreach loop that uses a SQL query array

所以,我一直在研究這個問題大約一個星期。 我發現了很多類似的問題,有類似this onethis 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 " &nbsp| &nbsp";
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' /> &nbsp<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 結果呈現的輸入對象)。 我試圖遵循:

  • POST/insert php 代碼在 foreach內部(末尾)的左上方。 這將導致所有由 foreach 返回的字符串搜索 ($strKey) 返回的結果被賦予為任何輸入元素提交的評級(因此,索引 [0],[1],[2],[ 3],[n]...獲得相同的評分)。 雖然它確實正確地獲取了 aud_ids,但它只是在一次提交中獲取了所有這些。
  • 上面的 POST/insert php 代碼位於 foreach 的外部(下方)。 無論使用哪個結果的輸入元素提交評級,這只會導致最后返回的結果(如果返回 5 個音頻,索引 [4])。 盡管如此,它仍會捕獲評級和 aud_id,僅針對錯誤的(始終是最后一個)返回結果。
  • 嘗試通過將 [] 添加到輸入名稱 = 來整理索引鍵的使用,就像這里包含的代碼一樣,嘗試將 $i(鍵)實現到我認為可行的各種元素($aud_id,$rate) , 等等。

這是沒有在 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>&nbsp;";
                                            if($count > 0)
                                            {
                                                $isAdmin = 'true';
                                                $fontStyle = " style='font-weight:bold;color:red;'";
                                                $root = "<span class='label label-danger'>Root</span>&nbsp;";
                                            }

                                        ?>
                                        <td><span style="color:red;"><?=$root;?></span><span<?=$fontStyle;?>><?=ucfirst(strtolower($row['firstname']))."&nbsp;".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>&nbsp;";
                                            if($count > 0)
                                            {
                                                $isAdmin = 'true';
                                                $fontStyle = " style='font-weight:bold;color:red;'";
                                                $root = "<span class='label label-danger'>Root Account</span>&nbsp;";
                                            }
                                        ?>
                                        <td><span style="color:red;"><?=$root;?></span><span<?=$fontStyle;?>><?=ucfirst(strtolower($row['firstname']))."&nbsp;".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> &nbsp"; ?>
<?php echo " <input class='rating' type='range' name='rating_s' min='0' max='100' step='1' value='50' /> &nbsp"; ?>
<?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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM