【问题标题】:How to make php post variable unique如何使php post变量唯一
【发布时间】:2013-08-10 20:04:18
【问题描述】:

这是我的原始代码

    <center>
    <html>
    <body>
    <form method="post" name="AwardList" action="<?php echo $_SERVER['PHP_SELF']?>"> 
    <table border=1>
    <tr>  
    <th><b>Award</b></th>
    <th><b>Issue ID</b></th>
    <th><b>Sort #</b></th>
    <th><b>Submit</b></th>
    </tr>

    <?php
    $userid = ($vbulletin->userinfo['userid']);
    $query = ("select a.*, userdisplayorder, issue_id from award a join award_user aw on a.award_id = aw.award_id where aw.userid = '$userid'");   

    if (isset($_POST['submit'])){
    $userdisplayorder = mysql_real_escape_string($_POST['userdisplayorder']);
    echo $_POST[issueid];
    echo '<br>';
    echo $userdisplayorder; 

    $sql = mysql_query("UPDATE award_user SET userdisplayorder='$userdisplayorder' WHERE issue_id='$_POST[issueid]'");
    }

    $result = mysql_query($query) or die(mysql_error());
$count = 1;
while ($row = mysql_fetch_array($result)){
    $awardimgurl = $row['award_img_url'];
    $ID = $row['issue_id'];

    // don't get it from the database since its not unique in the database itself
    // $userdisplayorder = $row['userdisplayorder'];

    echo '<tr>';        
    echo '<th>'; 
    echo "<img src='$awardimgurl'>"; echo '</th>';                    
    echo '<th>';
    echo '<input type="text" name="issueid" readonly="readonly" value="' . $ID . '" size="5">'; 
    echo '</th>';
    echo '<th>'; 
    echo '<input type="text" name="userdisplayorder" value="' . $count . '" size="5">';              
    echo '</th>';
    echo '<th>'; 
    echo "<center><input type='submit' name='submit' value='Submit'></center>"; 
    echo '</th>';
    echo '</tr>'; 
    $count ++;     
}   
    ?>   
    </table> 
    </html></center>

我还需要使 userdisplayorder 字段唯一。我已经拥有唯一的 issueid。我怎样才能做到这一点?请通过提供代码帮助我,我是 PHP 新手,只知道基础知识。我还不知道 PDO,我是视觉学习者 谢谢!

【问题讨论】:

  • 你可以把它变成一个数组:name="userdisplayorder[]"。你试过吗?
  • 此外,您似乎从数据库本身获得了 userdisplayorder 字段的值为 0。您可能想研究它并尝试在数据库级别本身修复它。
  • @Maximus2012 谢谢,但这没有用。它首先发出警告:mysql_real_escape_string() 期望参数 1 是字符串,给定数组,所以我只是将它发布到查询中而不转义,它不起作用。
  • @Panique 我只是在使用有效的方法。我是 PHP 的初学者。我不明白为什么人们在我只是想使用我已经知道有效的东西时如此苛刻。我不知道从哪里开始使用 PDO 和 MySQLi 等更高级的编码
  • 谢谢@pattyd 这就是我学会做什么并且对我有用的方法。我可以尝试学习更高级的代码,但这是我现在所知道的,我正在努力做到这一点工作。

标签: php mysql sql variables unique


【解决方案1】:

您最好将您的项目分组到数组中。

for ($i = 0; $row = mysql_fetch_array($result); ++$i) {

    // I took the liberty of adding HTML-encoding to the output.
    // This prevents issues if a field contains quotes, etc.
    $hrow = array_map('htmlentities', $row);
    extract($hrow, EXTR_PREFIX_ALL, 'html');

    $item_name = "items[$i]";
    echo <<<ENDHTML
    <tr>
     <th><img src="{$html_award_img_url}"></th>
     <th><input type="text" name="{$item_name}[issue_id]" readonly size="5"
               value="{$html_issue_id}"></th>
     <th><input type="text" name="{$item_name}[userdisplayorder]" size="5"
               value="{$html_userdisplayorder}"></th>
     <th><center><input type="submit" name="submitted[{$i}]" value="Submit"></center></th>
    </tr>
ENDHTML;
}

此时,由于 PHP 处理表单的方式,$_POST['items'] 将是一个数组,并且它的每个条目本身将是一个包含每个项目字段的数组。这几乎就像你说的$_POST['items'] = array(0 =&gt; array('issue_id' =&gt; '3', 'userdisplayorder' =&gt; '0'), 1 =&gt; array('issue_id'...。而submitted 将类似于array($index_of_row =&gt; 'Submit')。您可以使用它来确定单击了哪个项目的提交按钮,如下所示:

if (!empty($_POST['submitted'])) {
foreach ($_POST['submitted'] as $key => $unused) {
    $row = $_POST['items'][$key];
    # if you don't want to manually `mysql_real_escape_string` everything...
    $srow = array_map('mysql_real_escape_string', $row);
    ... process $srow ... which now has its own unique userdisplayorder field
}

或者,如果您只想每次处理所有项目:

if (!empty($_POST['items'])) {
    foreach ($_POST['items'] as $row) {
        $srow = array_map('mysql_real_escape_string', $row);
        ... process $srow ...
    }
}

【讨论】:

  • 谢谢你.. 但是,我假设这是我以前从未接触过的 PDO。我已经用我的代码替换了您的代码,并且该表没有从数据库中提取任何内容。如果您可以查看,我将使用新代码更新原始问题。 :)
  • 这与 PDO 无关。这与 PHP 如何处理表单有关。
  • 您使用$sql 来引用您的结果;我的示例使用了$result。改变那个变量,你应该没问题。顺便说一句,通常不赞成在发布后从根本上更改问题的代码;它使其他答案无效。
  • 呃,我不知道,抱歉。我将只编辑新代码,但也保留旧代码。将更改为 $result 看看会发生什么
  • 我将 $query 更改为 $result 并收到此错误:警告:mysql_fetch_array() 期望参数 1 是资源,字符串给定我添加了我正在使用的代码和您的代码到我的 OP
【解决方案2】:

改变这个:

$sql = mysql_query("UPDATE award_user 
SET userdisplayorder='$userdisplayorder' 
WHERE issue_id='$_POST[hiddenID]'");

到这里:

$sql = mysql_query("UPDATE award_user SET 
userdisplayorder='$userdisplayorder' 
WHERE issue_id='$_POST['issueid']'");

另外,您应该使用 MySQLi/PDO 代替 mysql_ 函数。 另外,我认为您不需要 JavaScript 函数来提交表单。你可以直接这样做。所以你可以改变这个:

echo '<th>'; echo "<center><input type='submit' 
name='submit' value='Submit' onclick=awardSort('$ID')></center>"; echo '</th>';

到这里:

echo '<th>'; 
echo "<center><input type='submit' name='submit' value='Submit' </center>"; 
echo '</th>';

更新。这是 OP 想要使 userdisplayorder 字段唯一的时候。一种方法是在表单级别进行更改,如下所示:

$count = 1;
while ($row = mysql_fetch_array($result)){
    $awardimgurl = $row['award_img_url'];
    $ID = $row['issue_id'];

    // don't get it from the database since its not unique in the database itself
    // $userdisplayorder = $row['userdisplayorder'];

    echo '<tr>';        
    echo '<th>'; 
    echo "<img src='$awardimgurl'>"; echo '</th>';                    
    echo '<th>';
    echo '<input type="text" name="issueid" readonly="readonly" value="' . $ID . '" size="5">'; 
    echo '</th>';
    echo '<th>'; 
    echo '<input type="text" name="userdisplayorder" value="' . $count . '" size="5">';              
    echo '</th>';
    echo '<th>'; 
    echo "<center><input type='submit' name='submit' value='Submit'></center>"; 
    echo '</th>';
    echo '</tr>'; 
    $count ++;     
}            

【讨论】:

  • 谢谢,但用户显示字段仍然不是按行唯一的。我怎样才能做到这一点?它必须是唯一的,否则它不起作用..如果我将 0 更改为任何其他数字,它不会保存更改,除非它是用于图片中显示的 issue_id 14537 的奖励..
  • 您需要在 mysql 查询中添加额外的逻辑来实现它。您当前的逻辑将您通过表单传递的任何值放入数据库。因此,如果您需要这些值是唯一的,那么您需要确保通过表单传递该字段的唯一值。
  • 现在没有什么是独一无二的了。如果我按 issue_id 88 的提交,它使用的是 issue_id 14537,如图所示。 (这发生在删除 javascript 后)
  • 我怎样才能使值独一无二?这就是我要问的。我正在尝试使用 Javascript :) 我根据您的回答用代码编辑了我的原始问题。
  • 你到底想用 JavaScript 做什么?
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 2013-03-31
  • 2011-10-30
  • 1970-01-01
  • 2010-12-07
  • 2020-09-17
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多