带引号的环绕字符串
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.");";
首先,我看你使用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进行调查,但这不是必需的。
创建您自己的。
function addQuotes($str){
return "'$str'";
}
或者为了使函数更好,还可以在其中添加mysql_real_escape_string。 – Marius 2010-02-21 01:42:51
不是直接将值插入到查询中,而是使用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”体系结构以获取更多信息。此外,应该进行验证。
以为我会贡献一个选项来回答“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"
一般提示:一定要命名,你插入值,以每列,只有“插入到COMPANIES值中(“。$ values。”)“如果您更改了表的结构,或者将参数按错误顺序排列,或者没有提供足够的参数,那么您的查询将会中断。 – chelmertz 2010-02-21 01:11:18
这是一个很好的PDO资源:http://www.kitebird.com/articles/php-pdo.html 。而且,我同意其中的其他帖子,准备好的陈述在所有方面都是一个提供查询的高级方法。 – JAL 2010-02-21 02:14:40
不检查魔术引号gpc设置时不要使用'stripslashes()'。你可以很容易地把它包装在一个自定义的'get_string()'函数中。 – BalusC 2010-02-21 04:32:31