2015-06-04 2 views
-1

У меня есть это вставить данные в базу данных MySQLiошибка вставки в Mysqli базу данных

<?php 
    $servername = "localhost"; 
    $username = "XXXXX"; 
    $password = "XXXXX"; 
    $dbname = "XXXXX"; 
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; 
    $ip_address = $_SERVER['REMOTE_ADDR']; 
    $last_url = $_SERVER['HTTP_REFERER']; 

    // Create connection 
    $conn = new mysqli($servername, $username, $password, $dbname); 
    // Check connection 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 

    $sql = "INSERT INTO url_referer (url_referer, ip address, current_url) VALUES ('$last_url', '$ip_address', '$url')"; 

    if ($conn->query($sql) === TRUE) { 
     echo " "; 
    } else { 
     echo "Error: " . $sql . "<br>" . $conn->error; 
    } 

    $conn->close(); 
    ?> 

Я получаю эту ошибку:

Error: INSERT INTO url_referer (url_referer, ip address, current_url) VALUES ('', '72.69.102.254', ' http://bithumor.co/ ') You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'address, current_url) VALUES ('', '72.69.102.254', ' http://bithumor.co/ ')' at line 1

Как это исправить?

+0

Не забудьте указать ВСЕ столбцы, которые существуют в таблице, даже если установлено значение auto increment. – OllyBarca

+2

Вам не хватает _ между «ip-адресом» должно быть 'ip_address'. Посмотрите на двух других, которые делают это. Также довольно уверен, что mysql недовольны coloums, используя имена, содержащие пробел. – Epodax

+1

Sidenote о '$ _SERVER ['HTTP_REFERER']'. Это ненадежно. Прочитайте http://stackoverflow.com/a/6023980/, после чего этот «ip-адрес» даст вам проблемы. Используйте тики '\' 'или присоединяйтесь к этим двум словам с подчеркиванием. –

ответ

0

Вы пропускаете подчеркивание в вашем синтаксисе для ip_address

$sql = "INSERT INTO url_referer (url_referer, ip address, current_url) VALUES ('$last_url', '$ip_address', '$url')";

должно быть: $sql = "INSERT INTO url_referer (url_referer, ip_address, current_url) VALUES ('$last_url', '$ip_address', '$url')";

Если имя столбца действительно ip address затем делать то, что @Fred-ii said.like ниже

(url_referer, `ip address`, current_url) 
+0

может быть, это их настоящая колонка с именем –

+0

извините. Благодарю. –

+0

добро пожаловать. –

3

Если ваше имя столбца действительно содержит пробел ip address, тогда его необходимо обернуть тиками или переименовать имя столбца, чтобы иметь подкрепление.

(url_referer, `ip address`, current_url) 

или переименовать его

(url_referer, ip_address, current_url) 

тогда вам не нужно будет тиков.

Однако тики необходимы, если они содержат зарезервированное слово MySQL или дефис или что-то еще, на что он будет жаловаться.

Sidenote: Я заметил, что у вас есть стол и столбец с таким же именем url_referer. Убедитесь, что это действительно так.

Плюс, как на мой комментарий:

Другое дело. Если это все еще дает вам проблемы, вам нужно будет избежать ваших данных.

т.е .:

$last_url = $_SERVER['HTTP_REFERER']; 
$last_url = mysqli_real_escape_string($conn, $last_url); 

и применить эту логику к вашим переменным, которые должны быть вставлены в таблицу.


Ваш действующий код открыт для SQL injection. Используйте prepared statements, или PDO with prepared statements, они намного безопаснее.


MySQLi подготовленные заявления пример:

<?php 
$link = new mysqli('xxx', 'xxx', 'xxx', 'xxx'); 
if ($link->connect_errno) { 
    throw new Exception($link->connect_error, $link->connect_errno); 
} 

// Check that the expected value has been provided via a POST request 
if (!isset($_POST['input'])) { 
    throw new Exception('Missing POST request parameter [input]'); 
} 

// now prepare an INSERT statement 
if (!$stmt = $link->prepare('INSERT INTO `table` (`column_x`) VALUES (?)')) { 
    throw new Exception($link->error, $link->errno); 
} 

// bind parameters 
$stmt->bind_param('s', $_POST['input']); 

if (!$stmt->execute()) { 
    throw new Exception($stmt->error, $stmt->errno); 
} 

Добавить error reporting в верхней части файла (ов), который поможет найти ошибки.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// rest of your code 

Sidenote: Сообщения об ошибках не должно быть сделано только в постановке, и никогда производства.

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