带引号的环绕字符串

问题描述:

PHP中是否有一个将引号添加到字符串的函数?带引号的环绕字符串

"'".str."'"

这对于VARCHAR处理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.");"; 
+4

一般提示:一定要命名,你插入值,以每列,只有“插入到COMPANIES值中(“。$ values。”)“如果您更改了表的结构,或者将参数按错误顺序排列,或者没有提供足够的参数,那么您的查询将会中断。 – chelmertz 2010-02-21 01:11:18

+1

这是一个很好的PDO资源:http://www.kitebird.com/articles/php-pdo.html 。而且,我同意其中的其他帖子,准备好的陈述在所有方面都是一个提供查询的高级方法。 – JAL 2010-02-21 02:14:40

+1

不检查魔术引号gpc设置时不要使用'stripslashes()'。你可以很容易地把它包装在一个自定义的'get_string()'函数中。 – BalusC 2010-02-21 04:32:31

首先,我看你使用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'); 

这一切都不过是减少你有轻微的样板量。

有些人建议使用PDO或mysqli来做这个事情,这样你就可以使用预准备语句。虽然他们可以是有用的,但它肯定是而不是必要的。您正在逃避这些领域,因此声称存在SQL注入漏洞(至少在此代码的情况下)是错误的。

最后,我不会这样构造查询。一方面,它依赖于公司表中的特定类型和顺序的列。明确这一点要好得多。我通常这样做:

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

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

+0

这不是说OP的代码容易受到SQL注入的影响,而是SQL注入甚至不是准备好的语句参数的问题。 – outis 2010-02-21 04:32:51

+0

在插入'aValue,otherValue'时会出现一个小小的“未填充”字段问题,但它的工作原理是 – serhio 2010-02-21 12:20:25

创建您自己的。

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

或者为了使函数更好,还可以在其中添加mysql_real_escape_string。 – Marius 2010-02-21 01:42:51

不要这样做。而是使用参数化查询,例如PDO

+0

我是初学者,PDO很复杂。我如何在具体情况下使用PDO(我添加了一些代码)?谢谢 – serhio 2010-02-21 00:42:07

+0

outis的答案进入了一个低层次的细节。 – 2010-02-21 00:45:14

不是直接将值插入到查询中,而是使用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对象(也连接到数据库,因此是一个对口mysql_connect)很简单:

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

你不应该在每一个脚本这分散你想要一个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”体系结构以获取更多信息。此外,应该进行验证。

+0

你如何创建你的$ db对象?我试过它给了我'致命的错误:调用一个非对象的成员函数prepare()in..' – serhio 2010-02-21 01:08:01

+0

你点击了帖子中的链接吗?那个说准备好的陈述的蓝色文本? – Marius 2010-02-21 01:41:50

+1

@Marius:是“蓝色文字”:)我是PHP的新手,不在此论坛:) – serhio 2010-02-21 10:59:39

以为我会贡献一个选项来回答“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 [email protected] 

这不是一个功能 - 但它的出现后的第一次在google上输入“php wrap string in quotes”。如果有人只是想用引号括现有的字符串,而无需通过函数首先运行它,这里是正确的语法:

echo $var // hello 

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

echo $var // "hello"