【问题标题】:insert into MySQL from an array with multi-type elements PHP从具有多类型元素 PHP 的数组中插入 MySQL
【发布时间】:2017-06-28 18:08:17
【问题描述】:

我正在尝试从数组中插入数据。问题是当我 implode 数组时,int 值转换为 String。有没有办法保留每个数组元素类型?

$insData=array (
    0 => string 'sds' (length=3)
    1 => string 'dsds' (length=4)
    2 => string '1251' (length=4)
    3 => string 'jklj' (length=4)
    4 => string 'jklj' (length=4)
    5 => int 0
    6 => string 'jkkj' (length=4)
    7 => int 0
    8 => int 0
    9 => int 0
    10 => int 0
    11 => int 0
    12 => int 0
    13 => int 0
    14 => int 0
    15 => int 0
    16 => int 0
    17 => int 0
    18 => int 0
    19 => int 0
    20 => int 0
    21 => int 0
    22 => int 0
    23 => int 0
    24 => int 0
    25 => string '2017-06-28 10:06:24')

$escaped_values = array_map('mysql_real_escape_string',array_values($insData));
$values  = implode(", ", $insData);
$sql1 = "INSERT INTO `myTable` VALUES ($values)";
var_dump($sql1);
=> INSERT INTO `myTable` VALUES (sds, dsds, 1251, jklj, jklj, 0, jkkj, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2017-06-28)
try {
    $stmt1 = $bdd->prepare($sql1, array(PDO::ATTR_CURSOR, PDO::CURSOR_SCROLL));
    $stmt1->execute();
    $row1 = $stmt1->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT);
    $stmt1 = null;
  }
  catch (PDOException $e){
    print $e->getMessage();
  }

我收到了 MySQl 错误。有没有办法解决这个问题:

INSERT INTO `myTable` VALUES ('sds', 'dsds', 1251, 'jklj', 'jklj', 0, 'jkkj', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '2017-06-28 10:06:24')

【问题讨论】:

  • 有错误信息吗?如果有,它说明了什么?
  • 在您的查询中缺少表fields
  • 错误:SQLSTATE[42S22]:未找到列:1054 '字段列表'中的未知列 'sds'
  • 你最好使用像 PDO 这样的东西,在那里你使用绑定变量,这意味着这些值无论如何都会保留它们的原始类型。 stackoverflow.com/questions/12019826/… 可能会有所帮助。
  • 显示完整的INSERT 查询

标签: php mysql


【解决方案1】:

从我发布的链接中,使用 PDO 准备好的语句并在执行语句时链接值...

$valueString = implode(',', array_fill(0, count($insData), '?'));

$stmt = $bdd->prepare("INSERT INTO myTable VALUES ({$valueString})");
$stmt->execute(array_values($insData));

编辑: 我认为您遇到的困难是您想在确保安全的同时保留类型。这将涉及仅在查询中的字符串字段而不是数字字段中加上引号。

您可以对数组进行循环并使用is_string($value),然后只引用这些字段。但这增加了很多复杂性和额外的处理。

【讨论】:

  • 不确定谁对你投了反对票,但这是给你的 +1 :)
  • @Maha 不要忘记将此答案标记为accepted answer
  • 不过,我很想解释一下为什么 PDO 查询不起作用..
【解决方案2】:
$integerIDs = array_map('intval', explode(',', $string));

【讨论】:

  • 请尽量避免仅仅将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。请编辑您的答案以包含clarification, context and try to mention any limitations, assumptions or simplifications in your answer.
  • 哪个 $string ?
  • @Frits 我不好试试这个链接来获取完整的信息 - w3schools.com/php/func_array_map.asp
  • @Maha $string 是要转换为数组的字符串。在你的情况下,它的 $insData
  • 不不不,你误会我了。不要给我链接,请在您的答案中添加相关文字。在我单击您提供的链接之前,您的答案应该是完全可以理解的(应该在您的答案中提供,而不是 cmets)。该链接应仅用于引用您的答案的来源。尝试通过编辑功能为您的答案添加基本解释 - 这将大大提高答案和您获得支持的机会:)
猜你喜欢
  • 2012-09-27
  • 2014-12-08
  • 2012-07-21
  • 2012-07-27
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多