【问题标题】:Generate a new id for row in database?为数据库中的行生成一个新的ID?
【发布时间】:2013-07-16 20:18:51
【问题描述】:

我正在使用 jQuery 可拖动,当可拖动元素移动时,我使用 ajax 将这些 css 值(左、上)保存到数据库 ($wpdb) 中...当有一个可拖动元素运行流畅时,我没有问题。 ..但是添加到项目中我想添加多个可拖动元素,这就是我遇到问题的地方...这是我将数据发送到数据库的代码...

    global $wpdb;


    //The data here comes from an ajax call
    $_POST['x'];
    $_POST['y'];
    $_POST['id']; 

    $term_id = 100; 
    $name = $_POST['id']; 
    $slug = $_POST['x'];
    $term_group = $_POST['y']; 

    if(isset($_POST['id'],$_POST['y'], $_POST['x'])){
        print_r($_POST);
    }

    //Im adding into wp_terms a default table (for testing)... 
    $query = "INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES (%s, %s, %s, %s)"; 

    //Here I insert the ajax data into the columns 
    $wpdb->query($wpdb->prepare($query, $term_id, $name, $slug, $term_group));

    $wpdb->update("$wpdb->terms", array('slug' => $_POST['x'], 'term_group' => $_POST['y']), array('name' => $_POST['id']));


    die();

这段代码总结起来:它连接到 $wpdb 然后我从 ajax 调用中获取数据并将它们存储在一个变量中。我的目标是 wp_terms 表...所以在可拖动元素stop ajax 数据发送到我的脚本并存储在数据库中,在 update 上,每次可拖动停止时我都会保留该行,并且只更新位于 slug && term_group 中的 xy 值,其中包含 name $_POST['id']... 这更新得很好,但是由于$term_id = 100 是一个静态值,我无法为具有新$_POST['id'] 的元素创建一个新行。这有意义吗.. 它比我简单得多认为我做到了......我正在尝试做我已经在做的事情,但是当有一个新的$_POST['id'] 时,我需要动态生成一个$term_id = 101,如果我手动给出该行,它就会完全按照我想要的方式工作101 的 term_id ...

表格是这样的……

我尝试添加 101 和 silly2.. 然后 102 silly3.. 类似的东西,然后当最后两个值 x 和 y 更改时,152 和 32 更改但 term_id 101 保持不变,而 silly 2 保持不变......

这里的事情是我不想创建一个 silly、silly2、silly3 的新实例...我想覆盖最后两列..

【问题讨论】:

  • 你能打印你的最终查询并替换值并尝试将它粘贴到 phpmyadmin 中,看看它给出了什么错误。你也可以对你的表结构有所了解吗?
  • 添加了一张表格的图片......当一个新的可拖动元素被创建时,它会得到一个 silly2 的 id...这个 id 通过 akax 传递并发送到 name 列.. . 它需要一个新的 term_id .. 但是一旦它得到一个新的 term_id 我希望它坚持.. 我可以生成一个随机 ID 但这对我不利

标签: php ajax database


【解决方案1】:

如果您正在运行标准 Wordpress 安装,wp_terms 表始终将 auto_increment 作为 term_id 的默认值,因此您可以删除静态 $term_id,现在查询应该是:

$query = "INSERT INTO $wpdb->terms (name, slug, term_group) VALUES (%s, %s, %s)"; 

$wpdb->query($wpdb->prepare($query, $name, $slug, $term_group));

希望这会有所帮助。

编辑:

您现在的问题与第一个问题完全不同。首先,您必须执行SELECT 查询以查看带有name 的行是否存在,例如:

$query = "SELECT FROM $wpdb->terms WHERE name=%s"; // remember to use prepare() after this

如果该行不存在,那么您可以像上面一样执行INSERT,如果该行存在,那么您应该执行UPDATE 查询:

$query = "UPDATE $wpdb->terms SET slug=%s, term_group=%s WHERE name=%s";

还有INSERT ... ON DUPLICATE KEY UPDATE 解决方案可以替换上述解决方案,但我对此并不那么有经验。

【讨论】:

  • 好点,你是对的,类似于之前它确实会生成自己的 id.. 如何覆盖现有名称?
  • 这听起来是个不错的解决方案.. 很高兴你能抽出时间.. 我得在某个地方,但我回来后会摆弄它.. 我敢打赌它有效.. 谢谢一百万: )
【解决方案2】:

尝试在 sql 表定义中使用auto increment。如果您无法修改表定义,您可以再添加一张表并将数据与其链接。

编辑以回答更改的问题。
在插入新行之前,您需要检查表中是否存在该值。 如果存在,则对该行执行更新 SQL 查询。否则插入新行。

【讨论】:

  • 这是要走的路。这是确保数据完整性的唯一方法。另外,请查看 php.net/manual/en/pdo.lastinsertid.php 以获取新插入的自动增量 ID
  • 也许增量不是我需要的?我不是 100% 确定,我认为这可能是有道理的.. 但事实上,如果 id 是新的,我正在尝试创建一个新行.. 但如果值发生变化则覆盖它?好的,所以我不必调整一些代码来覆盖现有的 ID...因为默认情况下 wordpress 会自动递增...如果它已经创建,我将如何覆盖..
  • 如果你想为一行生成一个新的、唯一的 ID,那么这就是你想要的。您应该将 wordpress 添加为标签,如果您使用一些内置的 wordpress 东西或您自己的表格,我没有仔细查看。如果您仍在使用 wordpress 的表格,它们可能具有执行您想要的功能。在幕后,这实际上是他们应该做的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
相关资源
最近更新 更多