我是 PHP 的新手,但即使我认为这也不正常。
我的代码一直在以下行中:
$insert = 'INSERT INTO boleia VALUES ('.$nick.', '.$data_format.', '.$custo.', '.$dest_origem.', '.$dest_destino.', NULL, '.$matricula.');';
我尝试使用双引号和那些双引号内的变量,什么都没有。
任何想法?
我是 PHP 的新手,但即使我认为这也不正常。
我的代码一直在以下行中:
$insert = 'INSERT INTO boleia VALUES ('.$nick.', '.$data_format.', '.$custo.', '.$dest_origem.', '.$dest_destino.', NULL, '.$matricula.');';
我尝试使用双引号和那些双引号内的变量,什么都没有。
任何想法?
您的 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 注入的攻击!
为了防止您必须使用适合您的数据库的函数来转义值,例如,由于您使用的是 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($dbconn, 'INSERT INTO boleia VALUES ($1, $2, $3, $4, $5, NULL, $6);',
array($nick, $data_format, $custo, $dest_origem, $dest_destino, $matricula));
插入查询中的每个值都需要用引号引起来,除非它是数字或 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();
您最好对 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.'", etc.
人,普通。原始问题只有 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 教程可供阅读.... 这要么是他的问题的确切答案之后的附加信息,要么是一个闲聊的话题。
干杯。
$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')";
你应该没事