我正在玩.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没有多少经验,所以我正在寻找一套新的眼睛来快速浏览一下我在这里发布的内容。
答案 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)
您应该查看mysqli或PDO而不是旧的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并使用PDO或MySQLi。如果您无法决定,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)
$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.