【问题标题】:How to add digit to MySQL database entry if already exists?如果已经存在,如何将数字添加到 MySQL 数据库条目?
【发布时间】:2020-08-22 02:32:06
【问题描述】:

我正在为我的网站创建一个博客输入系统,如果已经有一个条目 URL,我希望它创建相同的 URL 加上一个数字。

所以让我们以 URL“test”为例,如果 URL test 已经存在,我希望它是“test1” 如果 URL “test1”已经存在,我希望它是“test2”。

这是我现在(不是真的)这样做的方式:

如您所见,它并没有真正按照我想要的方式工作。它只能从“test”变为“test1” - 我怎样才能让它无限地动态重命名?

编辑:

好的,在收到我的批评后,我将所有内容都切换到了 PDO:

$title = $_POST['title'];
$author = $_POST['author'];
$content = $_POST['content'];

$date = new DateTime('now');
$date = $date->format('Y-m-d');

$domainurl = 'https://test.com/entry.php?';
$maxlength = (75 - strlen($domainurl));

if (strlen($_POST['title']) > $maxlength) {

    $url = wordwrap($_POST['title'], $maxlength);
    $url = substr($url, 0, strpos($url, "\n"));
    $url = strtr(strtolower($url), ' ', '-');

}else{

    $url = strtr(strtolower($_POST['title']), ' ', '-');

}

$url = preg_replace('/[^A-Za-z0-9\-]/', '', $url);

try {
    $options = [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES => false,
    ];
    $conn = new PDO("mysql:charset=utf8mb4;host=$servername;dbname=$dbname", $username, $password);

    $sql = "SELECT count(*) FROM blog WHERE url = ?"; 

    $sql = $conn->prepare($sql); 
    $sql->execute([$url]); 

    $rowCount = $sql->fetchColumn();

    if ($rowCount >= 1) {

        $url = $url . $rowCount;

    }

    try {

        $sql = $conn->prepare("INSERT INTO blog (date, title, url, author, content) 
        VALUES (:date, :title, :url, :author, :content)");

        $sql->bindParam(':date', $date);
        $sql->bindParam(':title', $title);
        $sql->bindParam(':url', $url);
        $sql->bindParam(':author', $author);
        $sql->bindParam(':content', $content);

        $sql->execute();

        $rowCount = $sql->rowCount();
        $id = $conn->lastInsertId();

        if ($rowCount > 0) {

            echo json_encode(array ('type' => 'success', 'message' =>"Blog entry created successfully"));

        }else{

            echo json_encode(array ('type' => 'danger', 'message' =>"Blog entry <strong>not</strong> created successfully"));

        }

    }catch(PDOException $e){

        echo json_encode(array ('type' => 'danger', 'message'=>$e->getMessage()));

    }

}catch(PDOException $e){

    echo json_encode(array ('response'=>'error','errorMessage'=>$e->getMessage()));
}
    $conn = null;

再一次:我想要发生的期望行为是如果输入“test”和“test”已经存在,那么它会转到“test1”,如果“test1”存在于数据库中,那么它会被重命名为“test2”并且以此类推。

就调试细节而言,目前它只转到“test1”,我不知道如何将它转到“test2”等等。

【问题讨论】:

  • 永远不需要 PDO,但是在 PDO 或 MYSQLI 中使用准备好的和绑定的参数化查询总是一个好主意。一旦你学会了如何正确地做,为什么还要再做坏事
  • $url从何而来,又会是什么样子
  • 你为什么不只计算条目并将其附加到 URL 上,这就是我要做的,而不是每次都添加。
  • 我希望你没有想到使用htmlspecialchars() 会有助于防止可能的SQL 注入。它没有。
  • Small Point 不挑眉我也不是@Dharman说你必须使用PDO。我们都说您可以使用 MYSQLI_ 或 PDO 但重要的事情是使用参数化绑定准备查询。

标签: php mysql url dynamic


【解决方案1】:

试试这个:

if ($rowcount >= 1) {
         preg_match_all('/\d+/', $url, $matches);

         $matches = $matches[0];

         if(count($matches)==0)
            $url.=1;
          else
          {
              $digit = $matches[count($matches) -1 ] + 1;
              $url= preg_replace('/'.($digit-1).'/', $digit, $url);
          }
   }

对于您的 SQL 命令,我建议使用准备好的语句来防止 SQL 注入。

【讨论】:

  • 我在尝试您的建议时遇到此错误:致命错误:未捕获的错误:不支持的操作数类型堆栈跟踪:第 42 行抛出 #0 {main}
  • 是的,但这并不能解决我的问题,它只会上升到“test1”之后的任何东西都只是“test1”......
  • 现在它在将 preg_replace 添加到 else 语句后适用于所有情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2017-01-04
  • 2018-08-13
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多