我正在尝试在内容表中插入值。如果我在VALUES中没有PHP变量,它可以正常工作。当我将变量$type
放在VALUES中时,这不起作用。我做错了什么?
$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
答案 0 :(得分:78)
将字符串添加到查询中的规则简单明了:
mysql_real_escape_string()
因此,您的代码变为
$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)
最好的选择是预备语句。使用引号和转义进行混乱是一件难以开始的工作,也很难维护。迟早你会不小心忘记引用某些东西或最终逃脱相同的字符串两次,或搞砸了类似的东西。可能需要数年才能找到那些类型的错误。
答案 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')