php - 如何仅通过 Key => Value 更新设置表

标签 php mysql pdo

我有一个按以下方式构建的设置表(为了简单起见,我在这里保留了简短的代码):

 ID |   key  |  value  |  category
-----------------------------------------
1   |  key_a | value_a |  geolocal
2   |  key_b | value_b |  geolocal
3   |  key_c | value_c |  geolocal
4   |  key_d | value_d |  opengraph
5   |  key_e | value_e |  opengraph

我通过 php/html 页面阅读此表,目标是能够更新上述设置

<?
require_once $_SERVER['DOCUMENT_ROOT'].'include/setup.php';

if (!empty($_POST['submit']) and $_POST['submit'] == "UPDATE") {
    ...
    ... I EXPLAIN THIS CODE, WHICH SHOULD WORK ONLY WHEN "SUBMIT" IS CLICKED, BELOW.
    ...

}

$query = "SELECT * FROM setup";
$sth = sql->prepare($query);
$sth->execute;

while($row = $sth->fetch(PDO::FETCH_ASSOC)){
    ${$row[$param]} = $row[$value];
?>
...
...
...
<div id="tabs-1">
    <form method="POST">
        <div class="tab">
            <p><label for="key_a">KEY 1</label><input name="key_a" value="<? echo $key_a; ?>" size="50"/></p>
            <p><label for="key_b">KEY 2</label><input name="key_b" value="<? echo $key_b; ?>" size="50"/></p>
            <p><label for="key_c">KEY 3</label><input name="key_c" value="<? echo $key_c; ?>" size="50"/></p>
            <p><label for="key_d">KEY 4</label><input name="key_d" value="<? echo $key_d; ?>" size="50"/></p>
        </div>
        <input type="submit" name="submit" value="UPDATE"><input type="reset" value="RESET">
    </form>
</div>
...
...
...
<?
} // END While
?>

key_a、key_b 等只是示例。 在现实中,被称为:

app_secret
artist_name
token_page_access
etc etc ...

因此,当我更新值时,我必须为每个条目创建以下查询(我上面提到的代码):

$query="UPDATE setup SET value = $_POST['key_a'] WHERE key = key_a";
$query="UPDATE setup SET value = $_POST['key_b'] WHERE key = key_b";
$query="UPDATE setup SET value = $_POST['key_c'] WHERE key = key_c";
$query="UPDATE setup SET value = $_POST['key_d'] WHERE key = key_d";

正如我所说,此表上不仅有 4 个值,而且有近 150 个值。

有没有办法简化UPDATE查询,使代码简化,更有效?

最佳答案

鉴于当前情况,您应该循环遍历 $_POST 超全局数组来执行 UPDATE 操作,如下所示:

if (!empty($_POST['submit']) and $_POST['submit'] == "UPDATE") {
    $query = "UPDATE `setup` SET `value` = :value WHERE `key` = :key";
    $sth = $sql->prepare($query);
    foreach($_POST as $key => $value){
        if($key != 'submit'){
            $sth->execute(array(':value'=>$_POST[$key], ':key'=>$key));
        }
    }
}

旁注: key 是 MySQL 中的保留字,value 是关键字。为了安全起见,您应该始终使用反引号封装表名和列名。 Keywords and Reserved Words in MySQL

关于php - 如何仅通过 Key => Value 更新设置表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49707390/

相关文章:

php - 重写YouTube网址

php - `return $this;` 设计模式还是反模式?

mysql - 如何获取每个用户的评分?

mysql - 如何使用 Symfony 插件 DbFinderPlugin 制定查询以按列分组进行计数?

mysql - 连接两个表,合并并转置结果

php - PDO 不更新 MYSQL

php - 在 PHP 中循环需要时间, fatal error : Maximum execution time of 120 seconds exceeded in

php - mysql查询,两张表。仅当值存在于其他表中时才选择

c# - 如何检查可变长度字符串以查看它们是否以数组中的任何内容开头

mysql - 选择未提交的数据