我试图从表中选择所有行,并在同一个表中更新列的值(基本上是标题列的自动段/永久链接重写)。但是,当我这样做时,它只是从所有行中的第一个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'的部分,但这并没有改变任何东西......
任何建议都非常感谢!感谢
答案 0 :(得分:0)
如果永久链接功能需要您的永久链接功能,只需选择那些字段(避免选择*)。
$sql = "SELECT id, title FROM titles";
此外,如果您可以在SQL中编写永久链接函数,则可以在一个UPDATE语句中完成此操作,而不是一次检索数据,重复逻辑和更新一条记录。例如:
UPDATE titles set permalink = REPLACE(REPLACE(REPLACE(title," ","-"),".",""),",","")
如果它比一些字符串替换更复杂,您可以编写存储的例程或坚持原始方法。你能分享一下preg_replace在做什么吗?错误可能在您省略的代码块中。
最后,注意SQL注入。使用单引号括起来的$ permalink执行SQL语句很容易受到SQL注入攻击。考虑使用准备好的声明:How Can I Prevent SQL Injection in PHP?
谢谢, 娄
答案 1 :(得分:0)
您确定,您的$固定链接分配是否正确?基于您想要的输出,我为永久链接创建了一个片段并测试了代码(还修正了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));
}
这段代码对我来说很好。如果这不能创建正确的输出,那么数据库表数据可能有问题
顺便说一下。你可以使用https://stackoverflow.com/a/8419128/1043150中的sql过程并将wohle代码分解为单个sql语句
UPDATE titles SET permalink = slugify(title)