【问题标题】:mysql prepared statement parameters and ordering queriesmysql准备好的语句参数和排序查询
【发布时间】:2010-10-19 06:23:10
【问题描述】:

我有一个表单,其目的是将当前显示的记录放入一个类别中。我正在通过 php 使用以下 html 代码:

<form name="categoryForm">
  <input name="radiobutton" type="radio" value="fakeapproved" />Fake (Approved)<p>
  <input name="radiobutton" type="radio" value="fakesuspected" />Fake (Suspected)<p>
  <input name="radiobutton" type="radio" value="keyword" />Forbidden Keywords<p>
  <input name="radiobutton" type="radio" value="parallelimport" />Parallel Imports
  <input name="Submit" type="submit" value="Update" onclick="handleClick(".$pk.");return false"/>
</form>

目前,我只有一个 AUCTIONS 表,其中包含一个类别列,并且此列设置为我的表单中定义的类别之一。

这种方法对我需要处理的数据无效,因此我计划将其更改为每个类别都有一个单独的列,可以设置为 true 或 false。

我想知道的是,是否可以在我的 sql 查询中使用我的表单中定义并通过我的 javascript 函数获得的文本。

例如,更新拍卖集 $textfromfrom = true

目前,我正在使用以下准备好的语句:

if($cmd=="addcat"){
  $alterQuery = "UPDATE auctions SET category = ? WHERE article_no= ?";
  if ($altRecord = $con->prepare($alterQuery)) {
    $altRecord->bind_param("ss", $subcat, $pk);
    $altRecord->execute();
    $altRecord->close();
    echo "true";
  } else {
    echo "false";
  }
}

有没有办法替代

$alterQuery = "UPDATE auctions SET category = ? WHERE article_no= ?";

与 $alterQuery = "更新拍卖 SET ? = true WHERE article_no= ?";

是否也可以直接执行单独的查询,即:

if($cmd=="addcat"){
  $alterQuery = "UPDATE auctions SET ? = true WHERE article_no= ?";
  $insertQuery = "INSERT into users (username, ?) values ?, true";
  if ($altRecord = $con->prepare($alterQuery)) {
    $altRecord->bind_param("ss", $category, $pk);
    $altRecord->execute();
  if ($insRecord = $con->prepare($insertQuery)) {
    $insRecord->bind_param("ss", $category, $username);
    $insRecord->execute();
    $insRecord->close();
  }
  $altRecord->close();
  echo "true";
} else {
  echo "false";
}

我使用上述方法的理由如下:

拍卖数据库是从另一个来源导入的,我根本无法更改结构,除了在末尾添加类别。主键等不得更改。

只有 4 个类别

单个拍卖可能属于多个类别

拍卖表只处理拍卖。我需要一个 users 表,它主要包含新的用户输入。

用户表必须能够为每个用户显示他们参与拍卖的类别。

每个用户的用户表中不能有超过一条记录。用户名将用作主键。

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    哎呀,经典的数据库非规范化即将发生。你不想这样做。您希望将其保留在单个列中,或者在拍卖和类型之间创建一对多的关系,这似乎是必要的。出现问题的第一个迹象是,没有捷径可以做您想做的事情。

    更好的方法是创建一个拍卖表和一个 categoryAuctionForm 表...

    看起来像:

    auctions Table:
    auction_id 
    ---------
    0
    1
    2
    3
    
    auctions Type:
    auction_type_id auction_id auction_type
    1               0          something
    2               0          othertype
    3               0          fake
    4               1          othertype
    5               2          fake
    6               3          fake
    

    您还可以添加更多级别的规范化,例如创建auction_type 列。

    只是我的想法。

    【讨论】:

    • 我已经更新了我的问题,以说明为什么我觉得我需要使用我概述的方法..感谢您对此的想法
    【解决方案2】:

    $alterQuery = "更新拍卖 SET ? = true WHERE article_no= ?";

    不,您不能对列名使用查询参数。 只能使用查询参数来代替 SQL 表达式中的文字值。

    您必须使用动态 SQL。也就是说,将 SQL 语句形成为字符串,并将您的应用程序变量作为列名插入到此字符串中。

    【讨论】:

    • 你的意思是这样的: $alterQuery = "更新拍卖集 $category = true WHERE article_no= ?";哪里可以根据输入定义 $category?
    • 是的,完全正确。在准备查询之前,所有表和列都必须在 SQL 字符串中命名。
    【解决方案3】:

    准备查询的重点是,除了数据之外,什么都不会改变。 您可以为您拥有的每个类别准备不同的查询(将它们放入按类别名称索引的数组中)。 但我怀疑准备查询实际上会在这里产生任何影响。

    【讨论】:

    • 除了数据不会改变,只是记录将添加到的类别是任意的,超出预定义的列表。
    猜你喜欢
    • 2020-12-08
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2018-08-29
    • 2020-05-20
    相关资源
    最近更新 更多