Строка окружения с кавычками - PullRequest
8 голосов
/ 21 февраля 2010

Есть ли в PHP функция, которая добавляет кавычки в строку?

нравится "'".str."'"

Это для SQL-запроса с varchars. Я немного искал, безрезультатно ...

Я делаю следующее:

$id = "NULL";
$company_name = $_POST['company_name'];         
$country = $_POST['country'];
$chat_language = $_POST['chat_language'];
$contact_firstname = $_POST['contact_firstname'];
$contact_lastname = $_POST['contact_lastname'];
$email = $_POST['email'];
$tel_fix = $_POST['tel_fix'];
$tel_mob = $_POST['tel_mob'];       
$address = $_POST['address'];       
$rating = $_POST['rating'];

$company_name = "'".mysql_real_escape_string(stripslashes($company_name))."'";
$country = "'".mysql_real_escape_string(stripslashes($country))."'";
$chat_language = "'".mysql_real_escape_string(stripslashes($chat_language))."'";
$contact_firstname = "'".mysql_real_escape_string(stripslashes($contact_firstname))."'";
$contact_lastname = "'".mysql_real_escape_string(stripslashes($contact_lastname))."'";
$email = "'".mysql_real_escape_string(stripslashes($email))."'";
$tel_fix = "'".mysql_real_escape_string(stripslashes($tel_fix))."'";
$tel_mob = "'".mysql_real_escape_string(stripslashes($tel_mob))."'";
$address = "'".mysql_real_escape_string(stripslashes($address))."'";
$rating = mysql_real_escape_string(stripslashes($rating));

$array = array($id, $company_name, $country, $chat_language, $contact_firstname, 
$contact_lastname, $email, $tel_fix, $tel_mob, $address, $rating);
$values = implode(", ", $array);

$query = "insert into COMPANIES values(".$values.");";

Ответы [ 6 ]

9 голосов
/ 21 февраля 2010

Вместо того, чтобы вставлять значение непосредственно в запрос, используйте подготовленные операторы и параметры, которые не уязвимы для SQL-инъекций .

$query = $db->prepare('SELECT name,location FROM events WHERE date >= ?');
$query->execute(array($startDate));

$insertContact = $db->prepare('INSERT INTO companies (company_name, country, ...) VALUES (?, ?, ...)');
$insertContact->execute(array('SMERSH', 'USSR', ...));

Создать объект PDO (который также подключается к БД и, следовательно, является аналогом mysql_connect) просто:

$db = new PDO('mysql:host=localhost;dbname=db', 'user', 'passwd');

Вы не должны разбрасывать это в каждом скрипте, где вы хотите соединение с БД. Во-первых, это скорее риск для безопасности. С другой стороны, ваш код будет более подвержен опечаткам. Решение решает обе проблемы: создайте функцию или метод, который устанавливает соединение с БД. Например:

function localDBconnect($dbName='...') {
    static $db = array();
    if (is_null($db[$dbName])) {
        $db[$dbName] = new PDO("mysql:host=localhost;dbname=$dbName", 'user', 'passwd');
        $db[$dbName]->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    return $db[$dbName];
}

Если вы работаете с массивом из более чем двух или трех элементов, вам следует использовать циклы или функции массива, а не длинную последовательность похожих операторов, как это делается в примере кода. Например, большая часть вашего образца может быть заменена на:

$array = array();
foreach ($_POST as $key => $val) {
    $array[$key] = "'" . mysql_real_escape_string(stripslashes($val)) . "'";
}

Вот более полный пример создания запроса на вставку. Это далеко от производства готов, но это иллюстрирует основы.

$db = localDBconnect();

// map input fields to table fields
$fields = array(
  'company' => 'company_name',
  'country' => 'country',
  'lang' => 'chat_language',
  'fname' => 'contact_firstname',
  'lname' => 'contact_lastname',
  'email' => 'email',
  'land' => 'tel_fix',
  'mobile' => 'tel_mob',
  'addr' => 'address',
  'rating' => 'rating',
);
if ($missing = array_diff_key($fields, $_POST)) {
    // Form is missing some fields, or request doesn't come from the form.
    ...
} else {
    $registration = array_intersect_key($_POST, $fields);

    $stmt = 'INSERT INTO `dbname`.`Companies` (`' 
        . implode('`, `', $fields) . '`) VALUES (' 
        . implode(', ', array_fill(0, count($registration), '?')) . ')';
    try {
        $query = $db->prepare($stmt);
        $query->execute(array_values($registration));
    } catch (PDOException $exc) {
        // log an 
        error_log($exc);
        echo "An error occurred. It's been logged, and we'll look into it.";
    }
}

Чтобы сделать его готовым к работе, код должен быть преобразован в функции или классы, которые скрывают всю базу данных, связанную с остальной частью кода; это называется " уровень доступа к данным ". Использование $fields показывает один из способов написания кода, который будет работать для произвольных структур таблиц. Посмотрите архитектуры " Model-View-Controller " для получения дополнительной информации. Кроме того, проверка должна быть выполнена.

8 голосов
/ 19 ноября 2014

Думаю, я бы добавил опцию, которая отвечает на вопрос "Есть ли в PHP функция, которая добавляет кавычки в строку?"- да, вы можете использовать str_pad(), хотя, вероятно, это проще сделать вручную.

Преимущества использования этой функции заключаются в том, что вы также можете передать символ для переноса переменной непосредственно в PHP:

function str_wrap($string = '', $char = '"')
{
    return str_pad($string, strlen($string) + 2, $char, STR_PAD_BOTH);
}

echo str_wrap('hello world');      // "hello world"
echo str_wrap('hello world', '@'); // @hello world@
8 голосов
/ 21 февраля 2010

Во-первых, я вижу, что вы используете stripslashes(). Это означает, что у вас есть магические кавычки . Я бы предложил отключить это.

То, что вы можете захотеть сделать, это поместить некоторые из них в функцию:

function post($name, $string = true) {
  $ret = mysql_real_escape_string(stripslashes($_POST[$name]));
  return $string ? "'" . $ret . "'" : $ret;
}

и затем:

$company_name = post('company_name');

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

Некоторые предлагают использовать для этого PDO или mysqli, чтобы вы могли использовать подготовленные операторы. Хотя они могут быть полезны, безусловно, не необходимо. Вы экранируете поля, поэтому утверждения об уязвимости для SQL-инъекций (по крайней мере, в случае с этим кодом) ошибочны.

Наконец, я бы не стал строить запрос таким образом. Во-первых, он полагается на столбцы в таблице компаний определенного типа и порядка. Гораздо лучше быть откровенным об этом. Я обычно делаю это:

$name = mysql_real_escape_string($_POST['name']);
// etc
$sql = <<<END
INSERT INTO companies
(name, country, chat_language)
VALUES
($name, $country, $language)
END;

Этого будет достаточно для выполнения задачи. Конечно, вы можете исследовать, используя mysqli или PDO, но это не обязательно.

4 голосов
/ 21 февраля 2010

Создайте свой собственный.

function addQuotes($str){
    return "'$str'";
}
2 голосов
/ 06 апреля 2016

Это не функция, но это первое сообщение, которое появляется в Google, когда вы набираете "php wrap string in quotes". Если кто-то просто хочет заключить существующую строку в кавычки, не пропуская ее сначала через функцию, вот правильный синтаксис:

echo $var   // hello

$var = '"'.$var.'"';

echo $var   // "hello"
2 голосов
/ 21 февраля 2010

Не делай этого. Вместо этого используйте параметризованные запросы, например, с PDO .

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