Php 如果已经存在,如何向MySQL数据库条目添加数字?
我正在为我的网站创建一个博客输入系统,如果已经有一个输入URL,我希望它创建相同的URL加上一个数字 因此,让我们以URL测试为例,如果URL测试已经存在,我希望它是test1如果URL test1已经存在,我希望它是test2 以下是我现在没有真正做到这一点的方式: 正如你所看到的,它并没有按照我想要的方式工作。它只能从一个测试转到另一个测试1——如何使它无限动态地重命名 编辑: 好的,在我接受了眉毛抽打之后,我把一切都切换到PDO:Php 如果已经存在,如何向MySQL数据库条目添加数字?,php,mysql,url,dynamic,Php,Mysql,Url,Dynamic,我正在为我的网站创建一个博客输入系统,如果已经有一个输入URL,我希望它创建相同的URL加上一个数字 因此,让我们以URL测试为例,如果URL测试已经存在,我希望它是test1如果URL test1已经存在,我希望它是test2 以下是我现在没有真正做到这一点的方式: 正如你所看到的,它并没有按照我想要的方式工作。它只能从一个测试转到另一个测试1——如何使它无限动态地重命名 编辑: 好的,在我接受了眉毛抽打之后,我把一切都切换到PDO: $title = $_POST['title']; $au
$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;
再一次:我希望发生的行为是,如果输入测试和测试已经存在,那么它将转到test1,如果数据库中存在test1,那么它将重命名为test2,依此类推
就调试细节而言,目前它只进入test1,我不知道如何进入test2等等。试试这个:
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注入。PDO从来都不需要,但是在PDO或MYSQLI中使用预处理和绑定参数化查询总是一个好主意。一旦你学会了如何正确地使用它,为什么还要再做一次呢?$url从哪里来,它会是什么样子?为什么你不数一数条目并将其固定到url上,这就是我要做的,而不是每次都添加。我希望你不会认为使用htmlspecialchars有助于防止可能的SQL注入。不是的。小点不皱眉头,我也不是。@Dharman说你必须使用PDO。我们都说过可以使用MYSQLI_uuo或PDO,但重要的是使用参数化绑定准备查询。当我尝试你的建议时,我遇到了这个错误:致命错误:未捕获错误:不支持的操作数类型堆栈跟踪:第42行抛出0{main}是的,但这并不能解决我的问题,它只会上升到test1,在这之后就是test1了……现在它在向else语句添加preg_replace之后适用于所有情况