是否可以使用$ variable而不是' row.table'在mysql查询中?

时间:2015-10-29 08:01:43

标签: php mysql

例如:

$sql = "SELECT * FROM purch_inv WHERE '".$anyrow."'='".$anyrecord."'";

$sql = "SELECT * FROM '".$table."' WHERE 'rowabc'='".$anyrecord."'";

我一直在尝试这个,但它没有用,有什么想法吗?

4 个答案:

答案 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;
}

}