Php 如何';真的';从数据库中检测整数?

Php 如何';真的';从数据库中检测整数?,php,mysql,Php,Mysql,我试图用以下代码保存一些代码。我有一个对象,其变量名与表行相同,因此我可以创建一个插入,如下所示: $query = "INSERT INTO table "; $columns = '('; $values = 'VALUES ('; foreach ($this as $var => $value){ if ($value){ $columns .= $var.', ';

我试图用以下代码保存一些代码。我有一个对象,其变量名与表行相同,因此我可以创建一个插入,如下所示:

$query = "INSERT INTO table ";
        $columns = '(';
        $values = 'VALUES (';
        foreach ($this as $var => $value){
            if ($value){
                $columns .= $var.', ';
                if (!is_int($value))
                    $value = '\''.$value.'\'';
                $values .= $value.', ';
            }
        }
        $columns .= ')';
        $values .= ')';
        $columns = str_replace (', )', ')', $columns);
        $values = str_replace (', )', ')', $values);
        $query .= $columns." ".$values;
但每一个变量都被检测为字符串,这并非如您所想象的在所有字段中都是如此


有人有解决方案吗?

看起来好像数字实际上是字符串。尝试使用is_numeric()而不是is_int()。
如果这还不够,您可以将字符串强制转换为整数,然后检查!=0.

您也可以在引号中插入数字作为字符串。这不会产生错误。

以下是我将如何编写它:

<?php
$canonical_columns = array_flip(array("column1", "column2", "column3"));
$columns = array_keys(array_intersect_key($canonical_columns, (array) $this));
$params = join(",", array_fill(0, count($columns), "?"));
$columns = join(",", $columns);
$query = "INSERT INTO table ($columns) VALUES ($params)";
$stmt = $pdo->prepare($query);
$stmt->execute(array_values($this));

每个变量都被检测为字符串,这是怎么回事?如果您试图将字符串(例如:text、longtext、varchar等)插入非字符串字段,那么您的MySQL应该会抛出一个错误。在MySQL 5中,如果您使用“整型”包装您的整数,那么它仍然可以工作,并将它们作为整数插入。上面的代码段中包含什么?顺便问一句:
如果(!is_int($value))$value='\'.$value'''.$value''.''''''.'$value
包含
我认为您的解决方案从长远来看不会为您节省任何代码,那么code>就会崩溃。它对SQL注入非常开放,并且将使生成除简单SQL语句之外的任何内容都非常困难。你真的应该查看或类似的文档。这很好,但是一些数据(如邮政编码)是字符串而不是数字,因此如果你尝试转换它,它将成功,然后在插入中失败。啊,误解了你对我的评论的回答。抱歉,我犯了一个错误,它是array\u keys()array\u values()。我将更新上面的代码示例。另请参阅,是的,我正在尝试使用PHP内置函数来更好地发挥作用,这样我们就不必为
循环编写太多代码,也不必进行细致的
=
字符串连接。$这不支持作为数组的参数,但感谢您的支持。这似乎是一个非常好的解决方案。是的,您可能需要将键/值对存储为关联数组,或者找到将对象字段转换为关联数组的方法。例如,
(数组)$this
有效(我测试过了)。好吧,这会引发更多的问题而不是答案。。。我试过使用$columns=join(“,”,array_key(array_intersect_key($canonical_columns,get_object_vars($this));)。虽然我尝试了3个值,但这是$query插入到表(name、middlename、姓氏)值(?)