代码之家  ›  专栏  ›  技术社区  ›  serhio

用引号将字符串括起来

  •  8
  • serhio  · 技术社区  · 16 年前

    PHP中是否有向字符串添加引号的函数?

    "'".str."'"

    这适用于带有varchars的sql查询。我搜索了一下,没有结果。。。

    $id = "NULL";
    $company_name = $_POST['company_name'];         
    $country = $_POST['country'];
    $chat_language = $_POST['chat_language'];
    $contact_firstname = $_POST['contact_firstname'];
    $contact_lastname = $_POST['contact_lastname'];
    $email = $_POST['email'];
    $tel_fix = $_POST['tel_fix'];
    $tel_mob = $_POST['tel_mob'];       
    $address = $_POST['address'];       
    $rating = $_POST['rating'];
    
    $company_name = "'".mysql_real_escape_string(stripslashes($company_name))."'";
    $country = "'".mysql_real_escape_string(stripslashes($country))."'";
    $chat_language = "'".mysql_real_escape_string(stripslashes($chat_language))."'";
    $contact_firstname = "'".mysql_real_escape_string(stripslashes($contact_firstname))."'";
    $contact_lastname = "'".mysql_real_escape_string(stripslashes($contact_lastname))."'";
    $email = "'".mysql_real_escape_string(stripslashes($email))."'";
    $tel_fix = "'".mysql_real_escape_string(stripslashes($tel_fix))."'";
    $tel_mob = "'".mysql_real_escape_string(stripslashes($tel_mob))."'";
    $address = "'".mysql_real_escape_string(stripslashes($address))."'";
    $rating = mysql_real_escape_string(stripslashes($rating));
    
    $array = array($id, $company_name, $country, $chat_language, $contact_firstname, 
    $contact_lastname, $email, $tel_fix, $tel_mob, $address, $rating);
    $values = implode(", ", $array);
    
    $query = "insert into COMPANIES values(".$values.");";
    
    6 回复  |  直到 16 年前
        1
  •  9
  •   mgraph    8 年前

    首先,我看到你在使用 stripslashes() magic quotes 在…上我建议把它关掉。

    您可能要做的是将其中的一部分放入函数中:

    function post($name, $string = true) {
      $ret = mysql_real_escape_string(stripslashes($_POST[$name]));
      return $string ? "'" . $ret . "'" : $ret;
    }
    

    然后:

    $company_name = post('company_name');
    

    然而,所有这些都只是稍微减少了您拥有的样板文件的数量。

    最后,我不会以这种方式构造查询。首先,它依赖于companys表中具有特定类型和顺序的列。最好把这件事说清楚。我通常这样做:

    $name = mysql_real_escape_string($_POST['name']);
    // etc
    $sql = <<<END
    INSERT INTO companies
    (name, country, chat_language)
    VALUES
    ($name, $country, $language)
    END;
    

    这将足以完成这项任务。当然,您可以使用mysqli或PDO进行调查,但这不是必需的。

        2
  •  11
  •   outis    16 年前

    prepared statements 和参数,它们不易受 SQL injection .

    $query = $db->prepare('SELECT name,location FROM events WHERE date >= ?');
    $query->execute(array($startDate));
    
    $insertContact = $db->prepare('INSERT INTO companies (company_name, country, ...) VALUES (?, ?, ...)');
    $insertContact->execute(array('SMERSH', 'USSR', ...));
    

    创建一个PDO对象(它也连接到DB,因此是 mysql_connect

    $db = new PDO('mysql:host=localhost;dbname=db', 'user', 'passwd');
    

    您不应该将其分散到每个需要DB连接的脚本中。首先,这更像是一种安全风险。另一方面,您的代码将更容易受到打字错误的影响。该解决方案解决了这两个问题:创建一个函数或方法来设置DB连接。例如:

    function localDBconnect($dbName='...') {
        static $db = array();
        if (is_null($db[$dbName])) {
            $db[$dbName] = new PDO("mysql:host=localhost;dbname=$dbName", 'user', 'passwd');
            $db[$dbName]->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return $db[$dbName];
    }
    

    如果使用的数组包含两个或三个以上的元素,则应使用循环或数组函数,而不是像示例代码中那样使用一长串类似语句。例如,您的大多数样本可以替换为:

    $array = array();
    foreach ($_POST as $key => $val) {
        $array[$key] = "'" . mysql_real_escape_string(stripslashes($val)) . "'";
    }
    

    下面是一个创建插入查询的更全面的示例。它还远没有准备好生产,但它说明了基本原理。

    $db = localDBconnect();
    
    // map input fields to table fields
    $fields = array(
      'company' => 'company_name',
      'country' => 'country',
      'lang' => 'chat_language',
      'fname' => 'contact_firstname',
      'lname' => 'contact_lastname',
      'email' => 'email',
      'land' => 'tel_fix',
      'mobile' => 'tel_mob',
      'addr' => 'address',
      'rating' => 'rating',
    );
    if ($missing = array_diff_key($fields, $_POST)) {
        // Form is missing some fields, or request doesn't come from the form.
        ...
    } else {
        $registration = array_intersect_key($_POST, $fields);
    
        $stmt = 'INSERT INTO `dbname`.`Companies` (`' 
            . implode('`, `', $fields) . '`) VALUES (' 
            . implode(', ', array_fill(0, count($registration), '?')) . ')';
        try {
            $query = $db->prepare($stmt);
            $query->execute(array_values($registration));
        } catch (PDOException $exc) {
            // log an 
            error_log($exc);
            echo "An error occurred. It's been logged, and we'll look into it.";
        }
    }
    

    data access layer ". 使用 $fields 显示了一种编写适用于任意表结构的代码的方法。“向上看” Model-View-Controller “了解更多信息。此外,还应进行验证。

        3
  •  8
  •   scrowler    11 年前

    我想我会提供一个选项来回答“PHP中是否有一个函数可以在字符串中添加引号?”- yes, you can 使用 str_pad() ,尽管手动操作可能更容易。

    使用此函数的好处是,您还可以传递一个字符,以便在PHP中以本机方式包装变量:

    function str_wrap($string = '', $char = '"')
    {
        return str_pad($string, strlen($string) + 2, $char, STR_PAD_BOTH);
    }
    
    echo str_wrap('hello world');      // "hello world"
    echo str_wrap('hello world', '@'); // @hello world@
    
        4
  •  4
  •   Phoexo    16 年前

    创造你自己的。

    function addQuotes($str){
        return "'$str'";
    }
    
        5
  •  3
  •   Ignacio Vazquez-Abrams    16 年前
        6
  •  2
  •   Brian Powell    10 年前

    这不是一个函数,但当你在谷歌上键入“php用引号括起来的字符串”时,这是第一篇出现在谷歌上的帖子。如果有人只想将现有字符串用引号括起来,而不首先通过函数运行它,下面是正确的语法:

    echo $var   // hello
    
    $var = '"'.$var.'"';
    
    echo $var   // "hello"
    
    推荐文章