如何在MySQL插入语句中包含PHP变量

时间:2011-09-24 06:12:09

标签: php mysql variables insert

我正在尝试在内容表中插入值。如果我在VALUES中没有PHP变量,它可以正常工作。当我将变量$type放在VALUES中时,这不起作用。我做错了什么?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");

11 个答案:

答案 0 :(得分:78)

将字符串添加到查询中的规则简单明了:

  1. 字符串应用引号括起来。
  2. 因此,应使用mysql_real_escape_string()
  3. 在数据以及其他一些字符中对这些引号进行转义

    因此,您的代码变为

    $type     = 'testing';
    $type     = mysql_real_escape_string($type);
    $reporter = "John O'Hara";
    $reporter = mysql_real_escape_string($reporter);
    
    $query    = "INSERT INTO contents (type, reporter, description) 
                 VALUES('$type', '$reporter', 'whatever')";
    mysql_query($query) or trigger_error(mysql_error()." in ".$query);
    // note that when running mysql_query you have to always check for errors
    

    但是,如果您要在查询的另一部分中添加变量,则规则会发生变化。

    • 要添加数字,您必须明确地将其强制转换为其类型。

    例如:

    $limit = intval($_GET['limit']); //casting to int type!
    $query = "SELECT * FROM table LIMIT $limit";
    
    • 要添加标识符,最好从某种白名单中选择,包含硬编码值

    例如:

    if ($_GET['sortorder'] == 'name') {
      $sortorder = 'name';
    } else {
      $sortorder = 'id';
    }
    $query = "SELECT * FROM table ORDER BY $sortorder";
    

    要简化并保证安全,必须使用某种占位符系统,其中变量不是直接进入查询,而是通过某些代理,称为占位符。

    因此,您的查询调用会变成这样:

    $type     = 'testing';
    $reporter = "John O'Hara";
    pquery("INSERT INTO contents (type, reporter, description) VALUES(?s, ?s, ?s)",
            $type, $reporter,'whatever');
    

    绝对没有必要担心所有这些问题。

    对于有限的占位符集,您可以使用PDO。虽然对于现实生活中的使用,您将需要扩展集,但由少数库提供,其中一个是SafeMysql

答案 1 :(得分:7)

只要它是一个字符串 - 你必须把它放在引号

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

而且,是的,正如Dani所说:您应该使用mysql_real_escape_string()

清理您在查询中添加的每个字符串

答案 2 :(得分:3)

$ type中的文本直接替换为insert字符串,因此MySQL得到了这个:

... VALUES(testing, 'john', 'whatever')

请注意,测试中没有引号,您需要将它们放入:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

我还建议您阅读SQL injection,因为如果您不清理正在使用的数据,这种参数传递很容易被黑客攻击:

答案 3 :(得分:3)

这是一个简单的答案:

$query="SELECT * FROM CountryInfo WHERE Name = '".$name."'";

你定义$name无论你想要什么 另一种方式,复杂的方式是这样的:

$query = " SELECT '" . $GLOBALS['Name'] . "' .* " .
         " FROM CountryInfo " .
         " INNER JOIN District " .
         " ON District.CountryInfoId = CountryInfo.CountryInfoId " .
         " INNER JOIN City " .
         " ON City.DistrictId = District.DistrictId " .
         " INNER JOIN '" . $GLOBALS['Name'] . "' " .
         " ON '" . $GLOBALS['Name'] . "'.CityId = City.CityId " .
         " WHERE CountryInfo.Name = '" . $GLOBALS['CountryName'] .
         "'";

答案 4 :(得分:2)

试试这个:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

您需要'$type'而不仅仅是$ type

答案 5 :(得分:1)

如果变量包含用户输入或您无法信任的其他数据,请务必转义数据。像这样:

$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type));
$result = mysql_query($query);

答案 6 :(得分:1)

下面

$type='testing' //it's string

mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");//at that time u can use it(for string)


$type=12 //it's integer
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");//at that time u can use $type

答案 7 :(得分:1)

我知道这个问题有一些答案,但我想我会补充一点,如果你遵循以下语法,我再也没有遇到过错误的问题。不管您正在使用哪个表以及要添加哪些列。

$query    = "INSERT INTO contents (type, reporter, description) 
         VALUES('".$type."', '".$reporter."', '"$whatever."')";

答案 8 :(得分:0)

避免SQL注入带有

的insert语句
for (i <- [1..4]) {
    boxes += box(text(toString(i)), onMouseEnter(void () {s = toString(i); redraw = true; }));
}

答案 9 :(得分:0)

最好的选择是预备语句。使用引号和转义进行混乱是一件难以开始的工作,也很难维护。迟早你会不小心忘记引用某些东西或最终逃脱相同的字符串两次,或搞砸了类似的东西。可能需要数年才能找到那些类型的错误。

http://php.net/manual/en/pdo.prepared-statements.php

答案 10 :(得分:0)

您必须将变量用单引号或双引号引起来,然后用大括号括起来,然后在其中输入变量名称(例如:$ abc)。

示例:

sourcedir ='R:'
destdir='C:/Users/rschafish/Desktop/TLC Media Project/filenames'
path ='.'
os.chdir (sourcedir)
cwd = os.getcwd()
print ('Working Directory is     %s' %cwd)
for dirPath, subdirNames, fileList in os.walk(sourcedir)
    for name in fileList:
        with open ('TLC Archive 111.txt', 'a') as outfile:
        os.chdir (destdir)
        fullpath=os.path.abspath(os.path.join(dirPath))
        outfile.write('TLC Archive 111.txt  '+fullpath +" \ "+name+ '\n')