【发布时间】: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 但重要的事情是使用参数化绑定准备查询。