【问题标题】:Update a custom column value sql更新自定义列值 sql
【发布时间】:2016-02-18 11:33:23
【问题描述】:

当拳击思维之外。我想出了以下解决方案:

$column = 'product';
$enum = '1';

$product_access = $dbh->prepare("UPDATE products_access SET {$column} = :enum WHERE products_access.id = :id");
$product_accessvar = trim($user['id']);
$product_access->bindParam(':id', $product_accessvar, PDO::PARAM_INT);
$product_access->bindParam(':enum', $enum, PDO::PARAM_INT);
//$product_access->bindParam(':product_enum', $enum);
//foreach($_POST["checkbox2"] as $loc_id) 
$product_access->execute();

感谢您的帮助,也许我可以帮助某人解决我的问题。它现在对我有用!


在我的问题下方

我对我的关注项目有疑问。我构建了一个 sql 表,用户可以在其中添加具有 enum 值的自定义列。但用户也可以更新此列的值。我无法设置任何列名,因为它们都是由用户自定义的,所以没有列名。

我的 SQL:

    tabel `products_access`
--

CREATE TABLE IF NOT EXISTS `products_access` (
  `id` int(30) NOT NULL,
  `user_id` int(30) NOT NULL,
  `product 2` enum('0','1') NOT NULL COMMENT 'Dit is een product beschrijving van product 2.dgfdg'
)

数组:

Array
(
    [id] => 17
    [name] => product 2
    [number] => 2002
    [description] => Dit is een product beschrijving van product 2.
    [mount] => 34
    [price] => 6778
    [deleted] => 0
    [user_id] => 17
    [product 2] => 1
)

脚本:

<label>
<input name="clickedproduct[]" type="checkbox" value="<?php echo $avlue['id']; ?>" <?php echo (($_SERVER['REQUEST_METHOD'] == 'POST') ? ((isset($_POST[$avlue['name']])) ? ' value="'.$avlue[$avlue['name']].'" checked' : ' value="'.$avlue[$avlue['name']].'"') : (($avlue[$avlue['name']] == '1') ? ' value="'.$avlue[$avlue['name']].'"checked' : ' value="'.$avlue[$avlue['name']].'"')); ?>>
<?php echo $avlue['name']; ?>
</label>  

PDO:

$product_access = $dbh->prepare('UPDATE products_access() VALUES(:id, :loc)');
$product_access->bindValue(':id', $id);
$product_access->bindParam(':loc', $loc_id);
foreach($_POST["checkbox2"] as $loc_id) $product_access->execute();

保存后数组下方。

Array 
( 
       [username] => joshua 
       [rank] => Array 
           ( 
               [0] => 0 
           )

       [koppel] => Array 
             ( 
                 [0] => 1 
             ) 

       [clickedproduct] => Array 
                     ( 
                         [0] => 17 
                     ) 
)

有人能解释一下解决方案吗?

【问题讨论】:

  • 数据库中不应有用户定义的列。
  • 为什么不呢?必须有一些解决方案来编辑​​它。
  • 我不禁对这个解决方案投了反对票,因为您正在失去 PDO 的主要好处:准备好的语句的安全性。
  • 你是什么意思?这是更新数据的解决方案。当他使用我的解决方案时,准备好的语句的安全方法就在他身上。此解决方案是整个脚本的示例。
  • 您的示例不安全,因为您在查询中添加了一个变量,而不是使用占位符准备它。并且没有办法为列名使用占位符。所以,这对任何人来说都是不安全的。

标签: php mysql pdo enums


【解决方案1】:

这类应用程序通常使用元数据表实现,也称为键/值存储。

此元数据表的每一行标识

  1. 它描述的对象,带有 product_id 或类似的外键。
  2. 它保存的数据项的名称,例如“价格”或“安装”
  3. 它所持有的数据项的值,例如“6778”或“34”
  4. (可选)标识项目数据类型的代码('money'?'text'?)

向对象添加元数据很容易。在元数据表中插入一行,给出所需的“列名”和值。检索它有点棘手。例如,您需要这样的查询。

 SELECT p.product_id, a.val as price, b.val as mount
   FROM product p
   LEFT JOIN metadata a ON a.product_id = p.product_id AND a.key='price'
   LEFT JOIN metadata b ON b.product_id = p.product_id AND b.key='mount'

WordPress 的wp_postmeta table 设置是这种数据设计模式的一个很好且广泛使用的示例。它有一个workable API

在生产环境中使用数据定义语言命令(如ALTER TABLE CHANGE colname newcolname INT)通常被认为是不好的做法。一方面,这些命令非常慢且线程不安全。另一方面,当架构包含各种用户定义的列时,很难进行故障排除。你最好使用应用程序代码,就像我在这里建议的那样,让你的用户创建他们自己的数据键和值。

【讨论】:

  • 好的,但这不是 wordpress,我可以按照你的方式完成,但我想要一个适合我的解决方案。
【解决方案2】:
  • 在“products_access”中创建一个名为“custom_column”的列。(添加用户 在此处定义列名)
  • 创建另一个名为“tbl_custom_column”的表
  • 添加字段“user_id”、“custom_column_value”(在此处添加您的值)

希望这会有所帮助。

【讨论】:

  • 有没有可能在我的路上做。要更改自定义列名称的值?
  • 您可以使用:ALTER TABLE products_access ADD custom_column enum('0','1') NOT NULL。但是使用它不是一个好主意:)
  • 谢谢@Ruby 但我无法添加列,因为我只需要编辑列的值而不是列名。
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多