在 SQL 数据库中存储字符串


Storing a string in a SQL database

我只是在玩.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)");

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

$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没有太多经验,所以我正在寻找一双新鲜的眼睛来快速浏览我在这里发布的内容。

我相信

你需要用单引号括起来,这样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() 之类的内容对其进行清理。

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

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

不是有效的 SQL:您必须在值周围添加单引号或双引号才能将它们视为字符串:

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

由于提交的字符串也可以包含引号(因此会使生成的 SQL 无效或执行您不希望它执行的任务),因此应始终使用预准备语句,或者如果不可用,则使用库的 escape 函数(例如 mysql_real_escape_string)正确转义字符串。

正如我已经评论过的:

请不要将mysql_*函数用于新代码。它们不再维护,社区已开始弃用过程。看到红框了吗?相反,您应该了解预准备语句并使用PDO或MySQLi。如果您无法决定,本文将帮助您选择。如果你想学习,这里有一个很好的PDO教程。

使用预准备语句时,您还可以摆脱那里令人讨厌的SQL注入漏洞。

要使用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'],
));

至于你最初的问题:你只是忘记了值周围的引号:-)

看起来您实际上是在尝试输入这些变量表示的值,而不是实际将 $field 0 插入 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 .  "')");

好的,在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 编码中执行剩余的工作。我认为这对初学者来说是一个很好的做法。

谢谢。

我的猜测是,PHP 以某种方式假设"YES"是一个布尔值(如 TRUE 或 FALSE 或 0 和 1,其中 0 等于 NO 和 1 等于 YES)。

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

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

不幸的是,PHP 并没有像 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