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、姓氏)值(?)