2010-05-30 2 views
1

У меня возникли проблемы с созданием этой, казалось бы, простой работы с запросом MySql. Может ли кто-нибудь обнаружить проблему?Проблемы с PHP и MySql

<?php 
include "config.php"; 

$offerid = $_POST["offerid"]; 
$ip = $_SERVER["REMOTE_ADDR"]; 

mysql_query("INSERT INTO voted (offerid,ip) VALUES (".$offerid.",".$ip.")"); 
?> 

ответ

5

Вы, вероятно, хотите, чтобы некоторые одиночные кавычки:

"INSERT INTO voted (offerid,ip) VALUES ('" . $offerid . "','" . $ip . "')" 

Вы также должны использовать intval и mysql_real_escape_string, чтобы избежать уязвимости SQL-инъекции:

$sql = "INSERT INTO voted (offerid,ip) VALUES (" . 
     intval($offerid). ", '" . 
     mysql_real_escape_string($ip) . "')"; 

Другой вариант, который может быть легче читать, для использования sprintf:

$sql = sprintf("INSERT INTO voted (offerid, ip) VALUES (%d, '%s')", 
       $offerid, mysql_real_escape_string($ip)); 
+0

Просто для того, чтобы добавить акцент: если вы не используете 'mysql_real_escape_string' или подготовленные заявления или что-то, чтобы предотвратить взлом, ** вы будете взломаны **. – Matchu

+0

@Mark Byers - должны ли одиночные кавычки быть там, если вы передаете целое число? – Matchu

+0

@Matchu не предотвращение взлома. Это просто синтаксис. –

0

мое предположение было бы с цитатами

mysql_query("INSERT INTO voted (offerid,ip) VALUES (\"".$offerid."\",\"".$ip."\")"); 
1

Чтобы поместить значение строки в запросе, необходимо выполнить 2 действия на него:

  • заключить его в кавычки

  • и бежать специальные символы.

Таким образом, запрос должен быть таким:

INSERT INTO voted (text) VALUES ('I\'m a programmer') 

Вооружившись этими знаниями, вы можете легко написать код, чтобы сделать правильный запрос:

$offerid = mysql_real_escape_string($_POST["offerid"]); 
$ip = mysql_real_escape_string($_SERVER["REMOTE_ADDR"]); 

$sql = "INSERT INTO voted (offerid,ip) VALUES ('$offerid','$ip')" 
mysql_query($sql) or trigger_error(mysql_error().$sql); 

Обратите внимание на trigger_error часть.
Это предоставит Вам исчерпывающую информацию о любой ошибке

+0

+1 для обработки ошибок. –

0
<?php 
include "config.php"; 

$offerid = $_POST["offerid"]; 
$ip = $_SERVER["REMOTE_ADDR"]; 

mysql_query("INSERT INTO voted (offerid,ip) VALUES ('".mysql_real_escape_string ($offerid)."','".mysql_real_escape_string ($ip)."')"); 
?> 

Это добавляет одинарные кавычки вокруг строк, которые вы вставляете - как mysql_real_escape_string функция PHP, которая будет бежать (добавить обратную косую черту Infront из) любой безопасности персонажей риска.

0

В дополнение к использованию intval(...) и mysql_real_escape_string(...) можно использовать parameterized statements (или заполнителей) с помощью PEAR::DB или PEAR::MDB2:

$dsn = "mysqli://testuser:[email protected]/test"; 
$conn =& DB::connect ($dsn); // using PEAR::DB, though it's been superseded 
if (DB::isError ($conn)) { 
    die ("Cannot connect: " . $conn->getMessage() . "\n"); 
} 

$result =& $conn->query ("INSERT INTO voted (offerid,ip) VALUES (?,?)", array($_POST["offerid"], $_SERVER["REMOTE_ADDR"])); 
if (DB::isError ($result)) { 
    die ("INSERT failed: " . $result->getMessage() . "\n"); 
} 

Использование заполнителей и параметров довольно часто встречается на других, чем PHP платформ, так что это не плохая идея понять основную посылку за ними.

Если вы заинтересованы в использовании модулей DB, подобных этим, я бы рекомендовал проверить Writing Scripts with PHP's PEAR DB Module Paul DuBois. Опять же, модуль, который он описывает, заменяется, но я нахожу его тем не менее интересным и информативным.

Смежные вопросы