0

我在 php 变量中有这个查询:

insert into `activadosmil` set cod='TAB08-150', stock='5', precio='111.23', categoria='Articulos destacados', subcategoria='PROMOS', descripcion='YARVIK JUNIOR 8" A9 1GB 8GB KIDO'Z ANDRO', ean='8717534019003', canon='111.23', fabricante='YARVIK'

它在描述='YARVIK JUNIOR 8" A9 1GB 8GB KIDO'Z ANDRO'

我尝试使用 htmlspecialchars($descripcion)

但不起作用。

如何将 php 中的 ' 替换为我需要用于 mysql 的代码?

提前致谢

4

3 回答 3

6

使用反斜杠转义字符。

insert into `activadosmil` set cod='TAB08-150', stock='5', precio='111.23', categoria='Articulos destacados', subcategoria='PROMOS', descripcion='YARVIK JUNIOR 8\" A9 1GB 8GB KIDO\'Z ANDRO', ean='8717534019003', canon='111.23', fabricante='YARVIK'
于 2013-09-12T21:44:36.587 回答
2

您应该使用适当的函数来转义字符串中的特殊 SQL 字符。根据您使用的驱动程序,mysql_real_escape_stringmysqli::real_escape_stringPDO::quote

不仅 ' 需要转义。使用正确的函数可以保证您不会忘记某些特殊字符,并且还可以正确处理字符编码(前提是您在连接上设置了正确的字符编码,mysqli::set_charset()或者为 mysql 或 PDO 设置了相应的字符编码)。

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");
$mysqli->set_charset("utf8");

// The original string
$description = 'YARVIK JUNIOR 8" A9 1GB 8GB KIDO\'Z ANDRO';

// Escape any special characters in the correct way for this database connection
$escaped_description = $mysqli->real_escape_string($description);

$mysqli->query("INSERT INTO activadosmil (description)" .
               " VALUES ('$escaped_description');");
于 2013-09-12T22:06:59.510 回答
1

我建议调查 PHP 手册页中描述的 mysqli 类的准备功能:

http://www.php.net/manual/en/mysqli-stmt.prepare.php

还有 bind_params 功能:

http://www.php.net/manual/en/mysqli-stmt.bind-param.php

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

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

/* create a prepared statement */
$stmt = mysqli_stmt_init($link);

$query='INSERT INTO activadosmil (cod, stock, precio, subcategoria, ".
"descripcion, ean, canon, fabricante) VALUES (?, ?, ?, ?, ?, ?, ?,?)';
if (mysqli_stmt_prepare($stmt, $query));{

    /* bind parameters for markers */
    // NB: the first parameter is a string of single char type indicators
    //      - One for each of the actual parameters s=string, d=double, I=integer, b=blob
    //      - In this case all 8 appear to be string - so 'ssssssss'
    mysqli_stmt_bind_param('ssssssss', $cod, $stock, $precio, $subcategoria, $descripcion, 
                           $ean, $canon, $fabricante);

    /* execute query */
    mysqli_stmt_execute($stmt);


    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);
?> 

使用 bind_param 应该可以防止引号出现任何问题。

于 2013-09-12T22:54:55.257 回答