代码之家  ›  专栏  ›  技术社区  ›  Matt Hutch

使用php向mysql数据库传递特殊字符

  •  1
  • Matt Hutch  · 技术社区  · 6 年前

    我的数据库似乎有点小问题。我使用的是mySQL,发布时使用的是php,但我面临的问题是,我无法将特殊字符发布到数据库中,因为它们在php中使用,会导致错误。所以我认为最好的选择是 mysqli_real_escape_string() 。因此,我设置了我的VAIRIABLE,并将其用作值,以便使用 mysqli\u real\u escape\u string() 我得到以下错误:

    警告:mysqli\u real\u escape\u string()正好需要2个参数,1 鉴于

    这使得我认为我没有正确设置它,因为我认为我只需要传递一个参数,而不是两个参数。我的php设置如下,如果有人能纠正我,那就太好了:

    <?php
    
      $servername = "localhost";
    
      $username = "root";
    
      $password = "";
    
      $dbname = "dbname";
    
      $conn = new mysqli($servername, $username, $password, $dbname);
    
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    
        $name = mysqli_real_escape_string(strtolower($_POST['name']));
    
        $header = strtolower($_POST['header']);
    
        $address = strtolower($_POST['address']);
    
        $city = strtolower($_POST['city']);
    
        $county = strtolower($_POST['county']);
    
        $post = strtolower($_POST['post']);
    
        $tele = strtolower($_POST['tele']);
    
        $mob = strtolower($_POST['mob']);
    
        $email = strtolower($_POST['email']);
    
        $web = strtolower($_POST['web']);
    
    
        $sql1 = mysqli_query($conn, "SELECT * FROM business_dir WHERE `name` = '$name'");
    
        $matchFound = mysqli_num_rows($sql1) > 0 ? 'true' : 'false';
    
        if ($matchFound == 'false') {
    
          $sql2 = "INSERT INTO business_dir (`name`, `header`, `address`, `city`, `county`, `post`, `tele`, `mob`, `email`, `web`) VALUES ('$name', '$header', '$address', '$city','$county','$post', '$tele', '$mob', '$email', '$web')";
    
          if ($conn->query($sql2) === TRUE) {
    
              echo '<div class="alert alert-success text-center" style="margin:20px;" role="alert">Business Succesfully Added!</div>';              
    
          }
    
          else {
    
            echo '<div class="alert alert-danger text-center" style="margin:20px;" role="alert">Error: ' . $sql2 . "<br>" . $conn->error.'</div>';
    
          }
    
        }
    
        else {
    
          echo '<div class="alert alert-danger text-center" style="margin:20px;" role="alert">Business Failed To Be Added, An Entry With The Same Name Already Exists!</div>';
    
        }
    
      }
    
    ?>
    

    谢谢各位。

    3 回复  |  直到 6 年前
        1
  •  0
  •   War10ck    6 年前

    您大量混合了面向对象函数和过程函数,这是行不通的。我已将您的完整示例转换为以下面向对象的方法:

    <?php    
        $servername = "localhost";
        $username = "root";
        $password = "";  
        $dbname = "dbname";
    
        $conn = new mysqli($servername, $username, $password, $dbname);
    
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            $name = $conn->real_escape_string(strtolower($_POST['name'])); 
            $header = strtolower($_POST['header']);
            $address = strtolower($_POST['address']);
            $city = strtolower($_POST['city']);    
            $county = strtolower($_POST['county']);
            $post = strtolower($_POST['post']);
            $tele = strtolower($_POST['tele']);    
            $mob = strtolower($_POST['mob']);    
            $email = strtolower($_POST['email']);    
            $web = strtolower($_POST['web']);
    
            $stmt = $conn->prepare("SELECT * FROM business_dir WHERE `name` = ?");
            $stmt->bind_param("s", $name);
            $stmt->execute();
            $stmt->store_result();
    
            $matchFound = $stmt->num_rows > 0 ? TRUE : FALSE;
    
            // Close the prepared statement
            $stmt->close();
    
            if ($matchFound === FALSE) {  
                $stmt = $conn->prepare("INSERT INTO business_dir (`name`, `header`, `address`, `city`, `county`, `post`, `tele`, `mob`, `email`, `web`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                $stmt->bind_param("ssssssssss", $name, $header, $address, $city, $county, $post, $tele, $mob, $email, $web);
    
                if ($stmt->execute() == TRUE) {
                    echo '<div class="alert alert-success text-center" style="margin:20px;" role="alert">Business Succesfully Added!</div>';              
                } else {
                    echo '<div class="alert alert-danger text-center" style="margin:20px;" role="alert">Error: ' . $sql2 . "<br>" . $conn->error.'</div>';
                }
    
                $stmt->close();
            } else {
                echo '<div class="alert alert-danger text-center" style="margin:20px;" role="alert">Business Failed To Be Added, An Entry With The Same Name Already Exists!</div>';
            }
        }
    
        // Close the mysqli connection
        $conn->close();
    ?>
    

    此外 mysqli_real_escape_string() 几乎无法防止 SQL注入式攻击 .因此,我修改了您的示例,使用准备好的语句来增加安全性。

        2
  •  0
  •   Julian Koster    6 年前

    相对简单,您必须向mysqli\u real\u escape\u string()中添加$conn。例如

    $firstname = mysqli_real_escape_string($conn, $_POST['firstname']);
    
        3
  •  0
  •   Lee    6 年前