3

我是 PHP 的新手,但即使我认为这也不正常。

我的代码一直在以下行中:

$insert = 'INSERT INTO boleia VALUES ('.$nick.', '.$data_format.', '.$custo.', '.$dest_origem.', '.$dest_destino.', NULL, '.$matricula.');';

我尝试使用双引号和那些双引号内的变量,什么都没有。

任何想法?

4

6 回答 6

4

您的 PHP 代码在语法上是正确的,但生成的 SQL 不是因为您没有使用引号来分隔值。

你可以这样做:

$insert = 'INSERT INTO boleia VALUES ("'.$nick.'", "'.$data_format.'", "'.$custo.'", "'.$dest_origem.'", "'.$dest_destino.'", NULL, "'.$matricula.'");';

或这个:

$insert = "INSERT INTO boleia VALUES ('".$nick."', '".$data_format."', '".$custo."', '".$dest_origem."', '".$dest_destino."', NULL, '".$matricula."');';

你也可以这样做:

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula');";

但不推荐任何一种方式,因为您容易受到SQL 注入的攻击!

如何防止 SQL 注入?

为了防止您必须使用适合您的数据库的函数来转义值,例如,由于您使用的是 PostgreSQL,您必须对每个值使用pg_escape_string() :

$insert = 'INSERT INTO boleia VALUES ("'.pg_escape_string($nick).'", "'.pg_escape_string($data_format).'", "'.pg_escape_string($custo).'", "'.pg_escape_string($dest_origem).'", "'.pg_escape_string($dest_destino).'", NULL, "'.pg_escape_string($matricula).'");';

另一种方法是使用pg_prepare()pg_execute()

pg_prepare($dbconn, "my_insert", 'INSERT INTO boleia VALUES ($1, $2, $3, $4, $5, NULL, $6);');
pg_execute($dbconn, "my_insert", array($nick, $data_format, $custo, $dest_origem, $dest_destino, $matricula));

甚至使用pg_query_params()

pg_query_params($dbconn, 'INSERT INTO boleia VALUES ($1, $2, $3, $4, $5, NULL, $6);',
                array($nick, $data_format, $custo, $dest_origem, $dest_destino, $matricula));
于 2012-12-14T13:06:29.707 回答
0

插入查询中的每个值都需要用引号引起来,除非它是数字或 NULL。

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula');";

如果您使用PDO,则不必担心引用或转义任何内容。

PDO 教程中的示例:

$stmt = $db->prepare("INSERT INTO table(field1,field2,field3) VALUES(:field1,:field2,:field3)");
$stmt->execute(array(':field1' => $field1, ':field2' => $field2, ':field3' => $field3));
$affected_rows = $stmt->rowCount();
于 2012-12-14T13:00:56.710 回答
-1

您最好对 SQL 字符串使用双引号,因为以后您可以更轻松地在没有用引号封装字符串的地方进行运动

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula')";
于 2012-12-14T13:01:11.600 回答
-1

您需要封装进入查询的字符串值。

例如

$insert = 'INSERT INTO boleia VALUES ("'.$nick.'", "'.$data_format.'", "'.$custo.'", etc.
于 2012-12-14T12:58:08.590 回答
-1

人,普通。原始问题只有 1 (ONE) 行长!正是这样:

$insert = 'INSERT INTO boleia VALUES ('.$nick.', '.$data_format.', '.$custo.', '.$dest_origem.', '.$dest_destino.', NULL, '.$matricula.');';

我们不必在这里修复任何非转义字符串,假设他以前没有这样做过,我们也不应该仅仅因为我们在标签中看到它就假设他正在使用 PostgreSQL。他有一个简单的错误——查询中缺少字符串封装。它是固定的,以最简单的形式,如下所示:

$insert = 'INSERT INTO boleia VALUES (\''.$nick.'\', \''.$data_format.'\', \''.$custo.'\', \''.$dest_origem.'\', \''.$dest_destino.'\', NULL, \''.$matricula.'\');';

就是这样!当且仅当我们想添加一些额外的信息,例如如何在未完成的情况下转义字符串,或者如果我们最好使用双引号,因为在这种情况下它不太容易出现人为错误,或者如果有一个很好的 PDO 教程可供阅读.... 这要么是他的问题的确切答案之后的附加信息,要么是一个闲聊的话题。

干杯。

于 2012-12-14T17:01:16.717 回答
-2
$db = new mysqli( some db data );

$nick = $db->real_escape_string( $nick );
$data_format = $db->real_escape_string( $data_format ); // this is probably not needed
$dest_origem = $db->real_escape_string( $dest_origem );
$dest_destino = $db->real_escape_string( $dest_destino );
$matricula = $db->real_escape_string( $matricula );

$insert = "INSERT INTO boleia VALUES ('$nick', '$data_format', '$custo', '$dest_origem', '$dest_destino', NULL, '$matricula')";

你应该没事

于 2012-12-14T13:09:12.297 回答