将带有空格的表单值插入到mysql 4.1中

时间:2011-10-03 02:23:46

标签: php mysql

我正在尝试将表单数据插入MySQL 4.1 DB。我遇到的问题是包含空格的表单字段在插入之前被截断。 POST变量是完整的,空格和所有。只是被切断了某个地方。例如,“南太浩湖”简单地插入“南”。邮编和带破折号的电话号码也没问题。我正在开发的网站由Yahoo Small Business托管,他们仍在使用MySQL 4.1。我不知道这是不是问题,但我知道我从来没有遇到过MySQL 5+这样的问题。用户填写表单以添加新成员。提交后,表单数据将发布到另一个页面进行处理:

$k = array();
$v = array();
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];

$result = mysql_query("SELECT * FROM members WHERE first_name='$first_name' AND last_name='$last_name'");
if(mysql_num_rows($result)>0){
    mysql_free_result($result);
    exit("Duplicate User in Database");
}
mysql_free_result($result);

array_pop($_POST);//Don't need the Submit value

foreach($_POST as $key=>$value){
array_push($k, "$key");
array_push($v, "$value");
}

$fields = implode(", ", $k);
$values = array();
foreach($v as $key=>$value){
    array_push($values, '"'.$value.'"');
}
$values_string = implode(", ", $values);

$result = mysql_query("INSERT INTO members($fields) VALUES($values_string)");

我确信有更好的方法可以做到这一点,但我仍然在学习曲线上。请指出我的想法中有任何明显的缺陷。 非常感谢任何建议。

编辑:MySQL中的字段类型是正确的,足够长。例如,City的字段设置为VARCHAR(30)。

非常感谢, 标记

2 个答案:

答案 0 :(得分:0)

<?php

// Remember to always escape user input before you use them in queries.
$first_name = mysql_real_escape_string($_POST['first_name']);
$last_name = mysql_real_escape_string($_POST['last_name']);

$result = mysql_query("SELECT * FROM members WHERE first_name='$first_name' AND last_name='$last_name'");
if (mysql_num_rows($result) > 0) {
    mysql_free_result($result);
    exit("Duplicate User in Database");
}
mysql_free_result($result);

// I removed your loop around $_POST as it was a security risk,
// and could also become non-working. (What would happen if the order
// of the $_POST keys were changed?)
// Also the code become clearer this way.

$result = mysql_query("INSERT INTO members(first_name, last_name) VALUES('$first_name', '$last_name')");

答案 1 :(得分:0)

这段代码非常不安全 - 您正在使用用户提供的值并将它们直接放入SQL语句中而不进行任何清理。您应该以这种方式对查询中插入的任何内容调用http://php.net/manual/en/function.mysql-real-escape-string.php(使用PDO的参数化查询更好)。

你也做了一些假设,例如$ _POST总是按照某种方式排序(有保证吗?),并且你的表单中的元素与表中的字段一样多,并且它们被命名相同。编写的代码是许多初学程序员所做的事情 - 感觉很有效,对吧?但最终这是一个坏主意。只需明确并列出字段 - 例如

$field1 = $_POST['field1'];
$field2 = $_POST['field2'];
$sql = "insert into mytable (field1, field2) values ('" . mysql_real_escape_string($field1) . "', '" . mysql_real_escape_string(field2) . "')";
mysql_query($sql);

我没有谈到为什么东西会在第一个空间切断,因为这意味着你提供的代码是可以挽救的。不是。我觉得如上所述重新加工可能会让问题消失。