例如:
$sql = "SELECT * FROM purch_inv WHERE '".$anyrow."'='".$anyrecord."'";
或
$sql = "SELECT * FROM '".$table."' WHERE 'rowabc'='".$anyrecord."'";
我一直在尝试这个,但它没有用,有什么想法吗?
答案 0 :(得分:1)
在php中你可以在双引号中使用变量(例如)
$name = 'John';
$var = "Hello $name!";
它显示: Hello John 。
使用单引号(例如)
$name = 'John';
$var = 'Hello $name!';
显示: Hello $ name 。
答案 1 :(得分:1)
单引号标记字符串文字 但是你想要同样的人;
SELECT * FROM identifier1 WHERE identifier2='stringliteral'
表名是标识符。身份标识 总是可以(有时必须)用反引号包裹。
SELECT x,y,z FROM `foo`
当我说表名是标识符时,这并不完全正确。在SELECT ... FROM foo
foo是一个名称;它恰好只包含一个标识符,即表名
可以有复合名称或多部分名称,由通过部件之间的点连接的多个标识符组成。在这种情况下,你可以(或必须)在反引号中包装每个单独的标识符;不是全名
SELECT x,y,z FROM `mydatabase`.`foo`
您选择的字段(在本例中为x,y和z)也是名称;所以适用相同的规则
SELECT `x`,`y`,`z` FROM `mydatabase`.`foo`
再次,如果你有多部分名称,你必须在反引号中单独包装每个标识符,而不是整个名称
SELECT
`foo`.`x`,
`bar`.`x`,
`foo`.`y`,
`bar`.`z`
FROM
`foo`
JOIN
`bar`
ON
`foo`.`x`>`bar`.`y`
那么,你什么时候使用单引号? 如果您想在查询中使用文字字符串,例如<。p>
SELECT x,y FROM foo WHERE y='abc'
这告诉MySQL解析器你想要将字段y
的值与字符串(文字)abc
进行比较,而
SELECT x,y FROM foo WHERE y=`abc`
会将字段y
的值与字段abc
的值进行比较(在我的示例中不存在,因此会引发错误)
完整回到您的问题
$sql = "SELECT * FROM `$table` WHERE `rowabc`='$anyrecord'";
但请注意http://docs.php.net/security.database.sql-injection关于$ anyrecord的问题 并确保它是你(而不是用户)谁控制$ table。
答案 2 :(得分:0)
是的,你可以
但您无法查询表名和列名
$sql="SELECT * FROM ".$table." WHERE rowabc='".$anyrecord."'";
另一个例子应该是这样的
$sql="SELECT * FROM purch_inv WHERE ".$anyrow."='".$anyrecord."'";
答案 3 :(得分:0)
显然你需要考虑SQL注入,并将变量传递给你的select查询!因此,因为table and column names cannot be replaced by parameters in PDO,您可以使用函数创建表名称的白名单以传递到您的查询中,然后使用PDO函数来执行语句:
$myWhitelist = array('table1', ...)
$myTable= array_intersect_keys($table1, array_flip($whitelist));
所以现在$ table1可以安全地传入你的select函数:
function select($conn, $table1, $someColumn) {
$myvar = $conn->prepare("SELECT FROM ".$table1." WHERE id = :someColumn");
$myvar->bindParam(":someColumn", $someColumn, PDO::PARAM_INT);
$myvar->execute();
if ($myvar->rowCount() > 0) {
return true;
} else {
return false;
}
}