2010-02-21 7 views
7

¿Hay alguna función en PHP que agregue comillas a una cadena?Cadena surround con comillas

como "'".str."'"

Se trata de una consulta SQL con varchars. He buscado un poco, sin resultado ...

hago lo siguiente:

$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.");"; 
+4

punta general: siempre el nombre de cada columna que desea insertar los valores a, con sólo " insertar en valores de EMPRESAS (". $ valores.") "su consulta se romperá si cambia la estructura de su tabla, o coloca los argumentos en el orden incorrecto, o no pone suficientes argumentos. – chelmertz

+1

Este es un gran recurso para PDO: http://www.kitebird.com/articles/php-pdo.html . Y, estoy de acuerdo con las otras publicaciones aquí que las declaraciones preparadas son en todos los aspectos una forma superior de armar una consulta. – JAL

+1

No use 'stripslashes()' sin verificar las comillas mágicas configuración de gpc. Puede envolver esto fácilmente en una función personalizada 'get_string()'. – BalusC

Respuesta

8

En primer lugar, veo que está utilizando stripslashes(). Eso implica que tiene magic quotes encendido. Sugeriría apagarlo.

Lo que es posible que desee hacer es poner algo de esto en una función:

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

y luego:

$company_name = post('company_name'); 

Todo esto sin embargo es reducir la cantidad de texto modelo que tiene ligeramente.

Algunos han sugerido usar PDO o mysqli para esto solo para que pueda usar declaraciones preparadas. Si bien pueden ser útiles, es necesario no necesarios. Estás escapando de los campos por lo que las afirmaciones de vulnerabilidad a la inyección de SQL (al menos en el caso de este código) están mal orientadas.

Por último, no crearía una consulta de esta manera. Por un lado, depende de que las columnas en la tabla de empresas sean de un tipo y orden particular. Es mucho mejor ser explícito sobre esto. Normalmente hago esto:

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

Eso será suficiente para la tarea. Por supuesto, puede investigar utilizando mysqli o PDO, pero no es necesario.

+0

No es que el código del OP sea vulnerable a la inyección de SQL, es que la inyección de SQL ni siquiera es un problema para los parámetros de declaración preparados. – outis

+0

aparece un pequeño problema de campo "sin relleno" aquí en insertar 'aValue,, otherValue', pero funciona – serhio

4

Crea el tuyo propio.

function addQuotes($str){ 
    return "'$str'"; 
} 
+2

O bien, para que la función sea aún mejor, agregue mysql_real_escape_string en ella también. – Marius

2

No haga esto. En su lugar, use consultas parametrizadas, como aquellas con PDO.

+0

Soy principiante, PDO es complejo. ¿Cómo puedo usar PDO en mi situación concreta (agregué un código)? Gracias – serhio

+0

La respuesta de outis entra en un poco de detalle de bajo nivel. –

9

En lugar de insertar el valor directamente en la consulta, use prepared statements y los parámetros, que no son vulnerables a SQL injection.

$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', ...)); 

Creación de un objeto PDO (que también se conecta a la base de datos y por lo tanto es una contrapartida a mysql_connect) es simple:

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

Usted no debe dispersar esto en cada guión en el que desea un DB conexión. Por un lado, es más un riesgo de seguridad. Por otro lado, su código será más susceptible a los errores tipográficos. La solución resuelve ambos problemas: crea una función o método que configura la conexión de BD. Por ejemplo:

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]; 
} 

Si está trabajando con una variedad de más de dos o tres elementos, se debe utilizar bucles o un arreglo de funciones en lugar de una larga secuencia de declaraciones similares, como se hace en el código de ejemplo.Por ejemplo, la mayor parte de su muestra se puede reemplazar por:

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

Aquí hay un ejemplo más completo de cómo crear una consulta de inserción. Está lejos de estar listo para producción, pero ilustra lo básico.

$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."; 
    } 
} 

Para que sea más listos para la producción, el código debe ser reprogramado para utilizar funciones o clases que ocultan todo lo relacionado con la base de datos del resto del código; esto se llama "data access layer". El uso de $fields muestra una forma de escribir código que funcionará para estructuras de tablas arbitrarias. Consulte las arquitecturas "Model-View-Controller" para obtener más información. Además, se debe realizar la validación.

+0

¿cómo se crea su objeto $ db? Lo intenté me da 'Fatal error: Llamada a una función de miembro prepare() en un no objeto en ...' – serhio

+0

¿Hizo clic en el enlace en la publicación? Ese texto azul que dice declaraciones preparadas? – Marius

+1

@Marius: sí "texto azul" :) Soy novato en PHP, no en este foro :) – serhio

5

Pensé en contribuir con una opción que responda a la pregunta "¿Hay alguna función en PHP que agregue comillas a una cadena?" - yes, you can use str_pad(), aunque probablemente sea más fácil hacerlo manualmente.

Ventajas de hacer con esta función son los que también se puede pasar a un personaje para envolver alrededor de la variable de forma nativa dentro de 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 [email protected] 
1

Esto no es una función - pero es el primer mensaje que aparece en google cuando escribe "php wrap string entre comillas". Si alguien sólo quiere envolver una cadena existente entre comillas, sin correr a través de una función en primer lugar, aquí es la sintaxis correcta:

echo $var // hello 

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

echo $var // "hello" 
Cuestiones relacionadas