在SQL数据库中存储字符串

时间:2012-08-07 22:09:01

标签: php sql

我正在玩.php和SQL,我正试图测试一些事情。我知道将变量存储在表中是一件非常容易的事情,但由于某种原因,它现在对我不起作用。

以下是我的表格:

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| v1    | varchar(255) | YES  |     | NULL    |       | 
| v2    | varchar(255) | YES  |     | NULL    |       | 
| v3    | varchar(255) | YES  |     | NULL    |       | 
| v4    | varchar(255) | YES  |     | NULL    |       | 
| v5    | varchar(255) | YES  |     | NULL    |       | 
| v6    | varchar(255) | YES  |     | NULL    |       | 
| v7    | varchar(255) | YES  |     | NULL    |       | 
| v8    | varchar(255) | YES  |     | NULL    |       | 
| v9    | varchar(255) | YES  |     | NULL    |       | 
| v10   | varchar(255) | YES  |     | NULL    |       | 
+-------+--------------+------+-----+---------+-------+

我像这样访问表格:

$result = mysql_query("INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ($field0, $field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8, $field9)");

我通过这样做从网址获取变量:

$field0 = $_GET['field0'];
$field1 = $_GET['field1'];
$field2 = $_GET['field2']; 
$field3 = $_GET['field3'];
$field4 = $_GET['field4'];
$field5 = $_GET['field5'];
$field6 = $_GET['field6'];
$field7 = $_GET['field7']; 
$field8 = $_GET['field8'];
$field9 = $_GET['field9'];

最后,我的网址是:

http://mywebsite.ca/anapplication?field0=YES&field1=GOOD&field2=GOOD&field3=GOOD&field4=YES&field5=GOOD&field6=GOOD&field7=GOOD&field8=A&field9=&

我收到一条错误消息,指出有一个未知列'YES'(第一个参数)。我用数字而不是字符串传递了相同的URL,令我惊讶的是一切都工作了。

我对.php或SQL没有多少经验,所以我正在寻找一套新的眼睛来快速浏览一下我在这里发布的内容。

6 个答案:

答案 0 :(得分:5)

我相信你需要用单引号包装你的值,这样mysql将它们视为字符串而不是整数。这就是为什么只传递数字而不传递数字的原因。

所以,

$result = mysql_query("INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ('$field0', '$field1', '$field2', '$field3', '$field4', '$field5', '$field6', '$field7', '$field8', '$field9')");

应该清理它。

此外,如果这是来自Web表单或其他外部源,请确保使用mysql_real_escape_string()等内容对其进行清理。

答案 1 :(得分:2)

您应该查看mysqliPDO而不是旧的mysql_库,但除此之外,问题是您没有生成有效的SQL。

INSERT INTO form2 (v1, v2 ...) VALUES(GOOD0, GOOD1 ...)

无效SQL:您必须在值周围添加单引号或双引号,以便将它们视为字符串:

INSERT INTO form2 (v1, v2 ...) VALUES('GOOD0', 'GOOD1' ...)

由于提交的字符串也可能包含引号(因此使生成的SQL无效或执行您不希望它执行的任务),因此您应始终use prepared statements或如果不可用,请通过以下方式正确转义字符串使用库的转义函数(例如mysql_real_escape_string)。

答案 2 :(得分:2)

正如我已经评论过的那样:

  

请不要将mysql_*函数用于新代码。它们已不再维护,社区已开始deprecation process。请参阅red box?相反,您应该了解prepared statements并使用PDOMySQLi。如果您无法决定,this article将有助于选择。如果您想学习,here is a good PDO tutorial

使用预备语句时,您还可以摆脱that nasty SQL Injection漏洞。

要使用PDO,您可以执行以下操作:

$pdo= new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare('INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES (:v1, :v2, :v3, :v4, :v5, :v6, :v7, :v8, :v9, v10');
$stmt->execute(array(
    ':v1'  => $_GET['field0'],
    ':v2'  => $_GET['field1'],
    ':v3'  => $_GET['field2'],
    ':v4'  => $_GET['field3'],
    ':v5'  => $_GET['field4'],
    ':v6'  => $_GET['field5'],
    ':v7'  => $_GET['field6'],
    ':v8'  => $_GET['field7'],
    ':v9'  => $_GET['field8'],
    ':v10' => $_GET['field9'],
));

关于你原来的问题:你只是忘记了值的引号: - )

答案 3 :(得分:0)

看起来您实际上是在尝试输入这些变量所代表的值,而不是实际将$ field0插入到v1字段中。所以你需要将字符串与单引号连接起来。我使用PHP已经有一段时间了,但应该使用“。”如果我没记错的话可能是这样的:

$result = mysql_query("INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ('" . $field0 . "', '" . $field1 . "', '" . $field2 . "', '" . $field3 . "', '" . $field4 . "', '" . $field5 . "', '" . $field6 . "', '" . $field7 . "', '" . $field8 . "', '" . $field9 .  "')");

答案 4 :(得分:0)

好的,在PHP中我们没有调试器模式来监视正在执行程序的变量和步骤,所以每当你在PHP中发现这类奇怪的错误或错误时,不要直接在初学者级别的数据库中插入值,首先你应该如你在问题中提到的那样从查询字符串中获取所有值,然后创建一个查询并分配到一个变量,如

$query ="INSERT INTO form2 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) VALUES ($field0, $field1, $field2, $field3, $field4, $field5, $field6, $field7, $field8, $field9)";

然后您需要在浏览器上回显该查询 echo $query; ,首先在 SQLYog或PHPMyAdmin 上执行,如果它正常工作则执行剩余的操作从事PHP编码工作。我认为对于初学者来说这是一个非常好的练习。

谢谢。

答案 5 :(得分:0)

我的猜测是,PHP假设“YES”是一个布尔值(如TRUE或FALSE或0和1,其中0等于NO,1等于YES)。

第一种方法是不使用完整的单词“YES”而是使用“y”或“n”。我注意到许多数据库使用CHAR(1)列表示是或否类型数据...在字段中存储简单的“y”或“n”。

如果这不是一个选项,保证插入字符串的最佳方法是让PHP在SQL INSERT之前将其转换为字符串。

不幸的是,PHP不会将BOOLEANS转换为STRINGS,就像strval()一样简单。但你可以做的是检查值是TRUE还是FALSE并相应地设置值。

<?php
$field0 = ($_GET['field0'] == "YES") : "YES" : "NO"; // if equals to YES set to (string) YES; else set to (string) NO.

http://php.net/manual/en/language.types.boolean.php