2015-03-30 2 views
-1

Я преобразование старого сценария быть уступчивым с MySQLi и побежал к проблеме ...запрос не работает при использовании mysqli_real_escape_string

$link = mysqli_connect("localhost", "user", "password", "database"); 

if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$myQuery = "INSERT INTO table (name, description) VALUES ('$name', '$description')"; 

if (!mysqli_query($link, $myQuery)) { 
    printf('Error'); 
} else { 
    printf('Success'); 
} 

mysqli_close($link); 

Это работает отлично, без ошибок. Но когда я добавляю mysqli_real_escape_string(), я получаю ошибку ...

$link = mysqli_connect("localhost", "user", "password", "database"); 

if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$myQuery = "INSERT INTO table (name, description) VALUES ('$name', '$description')"; 

$myQuery = mysqli_real_escape_string($link, $myQuery); 

if (!mysqli_query($link, $myQuery)) { 
    printf('Error'); 
} else { 
    printf('Success'); 
} 

mysqli_close($link); 

Это возвращает ошибку:

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 '\'TestName\', \'TestDescription\' at line 1

я упускаю что-то простое? Цитаты?

+1

'mysqli_real_escape_string' предназначен для экранирования строковых значений, а не всего запроса SQL. - Вместо этого прочитайте ссылку на параметр. И после того, как вы выяснили, почему это больше усилий с mysqli, просто переключитесь на PDO. – mario

+0

@mario Просто быстрое примечание, если вы, возможно, видели мой ответ после того, как разместили свой комментарий.Это не было основано на том, что вы опубликовали в своем комментарии, поскольку я уже печатал его. Это было чисто случайным. –

+0

@James. Я не уверен, что вы видели мой ответ или нет, но я сделал редактирование, и вам нужно будет перезагрузить его, чтобы посмотреть, что я изменил. –

ответ

3

Эта линия:

$myQuery = mysqli_real_escape_string($link, $myQuery); 

Это не правильно.

Вы должны использовать переменную $name, а не переменную $myQuery. Это то, что нужно ускользнуть, а не весь запрос.

$myQuery = mysqli_real_escape_string($link, $name); 

Однако^$myQuery должны быть заменены на каждой из переменных используются для вставки.

Ваш запрос должен выглядеть следующим образом:

$name = "TestName"; 
$description = "TestDescription"; 

$name = mysqli_real_escape_string($link, $name); 
$description = mysqli_real_escape_string($link, $description); 

$myQuery = "INSERT INTO `table` (name, description) VALUES ('$name', '$description')"; 

if (!mysqli_query($link, $myQuery)) { 
    printf('Error'); 
} else { 
    printf('Success'); 
} 

Nota:

Вы можете посмотреть в использовании mysqli with prepared statements или PDO with prepared statements, они намного безопаснее.


Плюс, только ради аргумента; table является MySQL reserved word это должно быть имя самой таблицы и требуется экранировать:

$myQuery = "INSERT INTO `table` 
  • Просто понимание.

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

$variable_1 = "Text"; 
$variable_2 = "More text"; 

$stmt = $link->prepare("INSERT INTO table_name 
         (column_1, column_2) 
         VALUES (?,?)"); 

$stmt->bind_param('ss', $variable_1, $variable_2); 
$stmt->execute(); 
  • Sidenote: s для струнных

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

$dbh = new PDO('mysql:host=localhost;dbname=your_DB', $user, $pass); 

$var_1 = "Text"; 
$var_2 = "More text"; 

$stmt = $dbh->prepare("INSERT INTO table_name 
         (column_1, column_2) 
         VALUES (:var_1,:var_2)"); 

$stmt->execute(array(':var_1' => $var_1, ':var_2' => $var_2)); 
+0

Я бы предположил, что как $ name, так и $ description просто заданы над образцом кода. Выглядит все как значения и код учебника. – mario

+0

@mario Я бы тоже предположил, но я хотел убедиться и сообщить OP. –

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