【问题标题】:SQL Query in PHP with unknown typePHP中未知类型的SQL查询
【发布时间】:2015-04-02 21:23:35
【问题描述】:

我想存储一个有时是字符串,有时是整数的值。 (在 PHP 和 mySQL 中)

变量设置如下:

$userID = 123; // Unique primary key, always a number
$name = "nameOfTheProperty"; // Always a string
$value = "someText" or 1234; // Depending on the property to save

如果它是整数属性,则此方法有效:

$sql = "INSERT INTO saves (`User_ID`, `$name`) VALUES ($userID, $value) ON DUPLICATE KEY UPDATE `$name`=$value";

如果它是一个字符串属性:

$sql = "INSERT INTO saves (`User_ID`, `$name`) VALUES ($userID, '$value') ON DUPLICATE KEY UPDATE `$name`='$value'";

我怎样才能让它正常工作?最好的一次查询。

【问题讨论】:

    标签: php sql types


    【解决方案1】:

    如果您将“字符串”传递给数字字段,MySQL 不会在意:

    INSERT INTO (intfield, charfield) VALUES ('42', '42')
    

    42 插入两个字段。

    但是,您所做的基本上容易受到 SQL 注入攻击。您应该使用准备好的语句和占位符。不幸的是,占位符不能代表除 VALUES 以外的任何内容,因此您仍然需要动态构建部分查询,例如

    $safefield = $db->real_escape_string('nameOfField');
    
    $sql = "INSERT INTO yourtable (`$safefield`) VALUES (?)";
    $stmt = $db->prepare($sql);
    $stmt->execute(array($value_for_field));
    

    【讨论】:

    • 我已经使用 urlencode() 对变量进行了预过滤。够了吗?并且 $name 只能有一些定义的值之一。
    • 没有。 urlencode 对于防止 sql 注入完全没用。
    • 你能给我一个在 urlencode 之后有害的示例值吗?
    • sql 注入不是你可以指向某物然后“这是有害的”的东西。注入攻击取决于被注入查询的结构。只是因为 urlencode() 会引用一些可用于注入攻击的字符,但这并不意味着它会涵盖所有可能被误解的字符。不要使用 urlencode 并认为你是安全的。这正是错误的态度。
    【解决方案2】:

    一列只能有一种类型。所以将列定义为varchar 并每次都使用引号。

    更好的解决方案是使用准备好的语句。

    【讨论】:

    • 我有多个列,其中一些是字符串,一些是 int。要写入的列由 $name 变量定义。
    • @Aron 然后使用 qouted 字符串。转换将由数据库完成。或使用准备好的语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2013-05-12
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多