Php 用引号将字符串括起来

Php 用引号将字符串括起来,php,string,Php,String,PHP中是否有向字符串添加引号的函数 像“'.”.str.“” 这适用于带有varchars的sql查询。我搜索了一下,没有结果 我做了以下工作: $id = "NULL"; $company_name = $_POST['company_name']; $country = $_POST['country']; $chat_language = $_POST['chat_language']; $contact_firstname = $_POST['contact_firs

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.");";

首先,我看到您正在使用
stripslashes()
。这就意味着你已经开始了。我建议把它关掉

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

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

$company_name = post('company_name');
然而,所有这些都只是稍微减少了您拥有的样板文件的数量

有些人建议为此使用PDO或mysqli,这样您就可以使用准备好的语句。虽然它们可能有用,但肯定没有必要。您正在转义字段,因此有关SQL注入漏洞的声明(至少在本代码中)是错误的

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

$name = mysql_real_escape_string($_POST['name']);
// etc
$sql = <<<END
INSERT INTO companies
(name, country, chat_language)
VALUES
($name, $country, $language)
END;
$name=mysql\u real\u escape\u字符串($\u POST['name']);
//等
$sql=创建您自己的

function addQuotes($str){
    return "'$str'";
}

不要这样做。相反,请使用参数化查询,例如带有。

的查询,而不是将值直接插入查询、使用和参数中,因为它们不易受攻击

创建一个PDO对象(它也连接到数据库,因此是mysql\u 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.";
    }
}

为了使它能够投入生产,代码应该被重构成函数或类,这些函数或类隐藏了所有与数据库相关的内容,不让其他代码看到;这被称为“a”。使用
$fields
显示了一种编写代码的方法,该方法可用于任意表结构。有关详细信息,请查阅“”体系结构。此外,还应该执行验证。

认为我应该提供一个选项来回答“PHP中是否有向字符串添加引号的函数?”的问题-使用,尽管手动操作可能更容易

使用此函数的好处是,您还可以传递一个字符,以便在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@

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

echo $var   // hello

$var = '"'.$var.'"';

echo $var   // "hello"

我是初学者,PDO很复杂。如何在我的具体情况下使用PDO(我添加了一些代码)?Thanksoutis的回答涉及到一些低级细节。如何创建$db对象?我试过了,它给了我一个致命错误:对..中的非对象调用成员函数prepare()
你点击了帖子中的链接了吗?那个写着准备好的语句的蓝色文本?@Marius:yes“蓝色文本”:)我是PHP新手,不在这个论坛:)@outis。当我收到连接时:
致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000][2005]未知MySQL服务器主机”localhost,dbname=mydbname'…
,但是这适用于
MySQL\u connect($host,$username,$password)
。@serhio:将DSN中的逗号改为分号(代码已更新以反映这一点)。这显示了阅读文档的价值()一般提示:始终使用“insert into companys values”(“.$values.”来命名要插入值的每一列)如果您更改了表的结构,或者将参数按错误的顺序放置,或者没有放置足够的参数,您的查询将中断。这是PDO的一个很好的资源:。而且,我同意这里的其他帖子,即准备好的语句在所有方面都是组合查询的一种更好的方式。不要使用
stripslashes()
无需检查magic quotes gpc设置。您可以轻松地将其包装在自定义的
get\u字符串()中
函数。或者,为了使函数更好,还可以在其中添加mysql\u real\u escape\u字符串。这并不是说OP的代码容易受到SQL注入的影响,而是SQL注入对于准备好的语句参数来说甚至都不是问题。在insert
aValue,otherValue
中出现了一个小小的“未填充”字段问题,但可以正常工作
echo $var   // hello

$var = '"'.$var.'"';

echo $var   // "hello"