MySQL选择所有列,并根据另一列更新特定的列字段


MySQL select all and update specific column fields based on another column

我试图从一个表中选择所有行,并更新同一表中的列值(基本上是标题列的自动slug/permalink重写)。然而,当我这样做时,它只是从所有行的第一个ID插入相同的"slug/permalink"重写,而不是为每一行单独重写和插入标题。

<?php
$sql = "SELECT * FROM titles"; 
$query = mysqli_query($con, $sql) or die (mysqli_error());
while ($row = mysqli_fetch_array($query)) { 
    $id = $row["id"];
    $title = $row["title"];
    // title rewrite function goes here
    $permalink = preg_replace ..... etc
    //add new permalink rewrite to slug column
    $sql2 = "UPDATE titles SET permalink='$permalink' WHERE id='$id'"; 
    $query2 = mysqli_query($con, $sql2) or die (mysqli_error());
} 
?>

目前,结果如下:

ID   Title              Permalink
1    This is Title 1    this-is-title-1
2    This is Title 2    this-is-title-1
3    This is Title 3    this-is-title-1

我也尝试过不使用WHERE id="$id"部分,但这不会改变任何内容。。。

非常感谢您的任何建议!感谢

你确定你的$permalink赋值是正确的吗?根据您想要的输出,我为permalink创建了一个片段,并测试了代码(还更正了mysqli_error函数..)

$sql = "SELECT * FROM titles";
$query = mysqli_query($con, $sql) or die (mysqli_error($con));
while ($row = mysqli_fetch_array($query)) {
    $id = $row["id"];
    $title = $row["title"];
    // title rewrite function goes here
    //$permalink = preg_replace ..... etc
    $permalink = preg_replace('~'s+~', '-', strtolower($title));
    //add new permalink rewrite to slug column
    $sql2 = "UPDATE titles SET permalink='$permalink' WHERE id='$id'";
    $query2 = mysqli_query($con, $sql2) or die (mysqli_error($con));
}

这段代码对我来说很好。如果这不能创建正确的输出,那么你的数据库表数据可能有问题

Btw。您可以使用中的sql过程https://stackoverflow.com/a/8419128/1043150并将wohle代码分解为单个sql语句

UPDATE titles SET permalink = slugify(title)

如果您的permalink函数只需要从表中取出ID和title,请只选择这些字段(避免选择*)。

$sql = "SELECT id, title FROM titles";

此外,如果您可以在SQL中编写permalink函数,那么您可以在一条UPDATE语句中实现这一点,而不是检索数据、重复逻辑和一次更新一条记录。例如:

UPDATE titles set permalink = REPLACE(REPLACE(REPLACE(title," ","-"),".",""),",","")

如果它比几个字符串替换更复杂,您可以编写一个存储例程或坚持使用原始方法。你能分享一下preg_replace在做什么吗?错误可能在您遗漏的代码块中。

最后,注意SQL注入。使用单引号包裹$permalink执行SQL语句容易受到SQL注入攻击。考虑使用一个预先准备好的语句:如何在PHP中防止SQL注入?

谢谢,Lou