Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果已经存在,如何向MySQL数据库条目添加数字?_Php_Mysql_Url_Dynamic - Fatal编程技术网

Php 如果已经存在,如何向MySQL数据库条目添加数字?

Php 如果已经存在,如何向MySQL数据库条目添加数字?,php,mysql,url,dynamic,Php,Mysql,Url,Dynamic,我正在为我的网站创建一个博客输入系统,如果已经有一个输入URL,我希望它创建相同的URL加上一个数字 因此,让我们以URL测试为例,如果URL测试已经存在,我希望它是test1如果URL test1已经存在,我希望它是test2 以下是我现在没有真正做到这一点的方式: 正如你所看到的,它并没有按照我想要的方式工作。它只能从一个测试转到另一个测试1——如何使它无限动态地重命名 编辑: 好的,在我接受了眉毛抽打之后,我把一切都切换到PDO: $title = $_POST['title']; $au

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

因此,让我们以URL测试为例,如果URL测试已经存在,我希望它是test1如果URL test1已经存在,我希望它是test2

以下是我现在没有真正做到这一点的方式:

正如你所看到的,它并没有按照我想要的方式工作。它只能从一个测试转到另一个测试1——如何使它无限动态地重命名

编辑:

好的,在我接受了眉毛抽打之后,我把一切都切换到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;
再一次:我希望发生的行为是,如果输入测试和测试已经存在,那么它将转到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之后适用于所有情况