草庐IT

php - 必须插入varchar时如何将数组插入MySQL

coder 2023-10-20 原文

See the image here我有一个收集以下信息的表格:年份(int)、案例编号(varchar)和接收时间(varchar)。由于年份是数字,我在 MySQL 中设置了 int,然后 Case number 和 Time Received 都有数字和字母,因此我在 MYSQL 中设置了 varchar。我使用数组是因为我插入了很多记录。我对数组使用 mysql_real_escape_string()。但它没有用。如何将包含字母、符号和数字的数组传递到 MySQL 中?谢谢你。

//Output any connection error
if ($mysqli->connect_error) {
die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
}
if (isset($_REQUEST['submit']) && isset($_REQUEST['year']) ) {
  foreach ($_REQUEST['year'] as $k=> $value ){ // loop through array

    $year     = $_REQUEST['year'];
    $c_no        = mysql_real_escape_string($_REQUEST['cs']);
    $t_r        = mysql_real_escape_string($_REQUEST['t_r']);


$mysqli->query("INSERT INTO firearms_id_secs (year, case_no, t_received) VALUES 
   ($year[$k], $c_no[$k], $t_r[$k])");
}
}
?>

这是HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Add more fields using jQuery</title>
<script src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var maxField = 10; //Input fields increment limitation
var addButton = $('.add_button'); //Add button selector
var wrapper = $('.field_wrapper'); //Input field wrapper
var fieldHTML = '<div><input type="text" name="year[]" value="" placeholder="Year"/><input type="text" name="cs[]" value="" placeholder="Case no"/><input type="text" name="t_r[]" value="" placeholder="Time Received"/><a href="javascript:void(0);" class="remove_button" title="Remove field"><img src="remove-icon.png"/></a></div>'; //New input field html 
var x = 1; //Initial field counter is 1
$(addButton).click(function(){ //Once add button is clicked
    if(x < maxField){ //Check maximum number of input fields
        x++; //Increment field counter
        $(wrapper).append(fieldHTML); // Add field html
    }
});
$(wrapper).on('click', '.remove_button', function(e){ //Once remove button is clicked
    e.preventDefault();
    $(this).parent('div').remove(); //Remove field html
    x--; //Decrement field counter
    });
});
</script>
<style type="text/css">
input[type="text"]{height:20px; vertical-align:top;}
.field_wrapper div{ margin-bottom:10px;}
.add_button{ margin-top:10px; margin-left:10px;vertical-align: text-bottom;}
.remove_button{ margin-top:10px; margin-left:10px;vertical-align: text-    bottom;}
</style>
</head>
<body>
<form name="codexworld_frm" action="" method="post">
<div class="field_wrapper">
<div>

        <a href="javascript:void(0);" class="add_button" title="Add field"><img     src="add-icon.png"/></a>
</div>
</div>
<input type="submit" name="submit" value="SUBMIT"/>
</form>
</body>
</html>

最佳答案

提交表单时_POST(或_REQUEST)看起来像这样

array (
  'year' => 
  array (
    0 => '2001',
    1 => '2010',
  ),
  'cs' => 
  array (
    0 => '1',
    1 => '2',
  ),
  't_r' => 
  array (
    0 => '12:00:00',
    1 => '13:00:00',
  ),
  'submit' => 'SUBMIT',
)

如果像这样就更好了

array(
    'records' = array(
        0=>array('year'=>'2001', 'cs'=>'1', 't_r'=>'12:00:00'),
        0=>array('year'=>'2010', 'cs'=>'2', 't_r'=>'13:00:00'),
    ),
)

这需要更改 javascript 代码(我现在太懒了...所以我使用 SPL MultipleIterator 来“模拟”该数据格式)

if ( isset($_POST['submit']) ) {
    // add tests for is_array() POST[year], POST[cs] and POST[t_r]

    // this will make mysqli throw an exception whenever an operation results in an 
    // (mysql) error code other than 0 -> no further error handling included in this script....
    mysqli_report(MYSQLI_REPORT_ALL|MYSQLI_REPORT_STRICT);
    $mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test');

    // create a prepared statement and bind the parameters, see http://docs.php.net/mysqli.quickstart.prepared-statements
    $stmt = $mysqli->prepare('INSERT INTO firearms_id_secs (year, case_no, t_received) VALUES (?,?,?)');
    if ( !$stmt->bind_param('sss', $year, $caseno, $time) ) { // binding all parameters as strings ...let mysql's type system handle it...
        yourErrorHandlerHere(); // or throw an exception....
    }
    // when ever the statement is executed, the current values (at _that_ moment) in $year, $caseno and $time will be used where the ? are in the statement

    // this wouldn't be necessary if the POST body looked like record[1][year]=2001&....
    $mit = new MultipleIterator;
    $mit->attachIterator( new ArrayIterator($_POST['year']) );
    $mit->attachIterator( new ArrayIterator($_POST['cs']) );
    $mit->attachIterator( new ArrayIterator($_POST['t_r']) );

    foreach( $mit as $record ) {
        echo 'executing statement with [', join(',', $record), "]<br/>\r\n";
        // assign the values to the bound parameters
        list($year,$caseno,$time) = $record;
        // and then execute the statement (with those values)

        /*
        you might want to wrap this in a try-catch block, so a single faulty record will not throw off your entire script.
        You might also want to look into transactions (in case a single faulty record is supposed to roll back the entire operation)
        see http://docs.php.net/language.exceptions , http://dev.mysql.com/doc/refman/5.7/en/commit.html
        */
        $stmt->execute();
    }
}

编辑: a) 要允许 NULL 值,您应该在参数中用 NULL 替换空字符串

...
// replace empty strings by NULL
$record = array_map(
    function($e) {
        return 0<strlen(trim($e)) ? $e : NULL;
    },
    $record
);

// assign the values to the bound parameters
list($year,$caseno,$time) = $record;
...

b) 我不知道在这种情况下为什么以及在哪里需要迭代器的 key ,但是......

<?php
$data=array(
    'maj'=>new ArrayIterator(array('A','B','C')),
    'min'=>new ArrayIterator(array('a','b','c')),
    'foo'=>new ArrayIterator(array('do'=>'re', 'mi'=>'fa', 'so'=>'la', 'ti')),
);

$mit = new MultipleIterator(MultipleIterator::MIT_NEED_ANY|MultipleIterator::MIT_KEYS_ASSOC);
$mit->attachIterator( $data['maj'], 'majuscule' );
$mit->attachIterator( $data['min'], 'minuscule' );
$mit->attachIterator( $data['foo'], 'lalala' );

foreach( $mit as $r ) {
    var_export($r);
}

打印

array (
  'majuscule' => 'A',
  'minuscule' => 'a',
  'lalala' => 're',
)array (
  'majuscule' => 'B',
  'minuscule' => 'b',
  'lalala' => 'fa',
)array (
  'majuscule' => 'C',
  'minuscule' => 'c',
  'lalala' => 'la',
)array (
  'majuscule' => NULL,
  'minuscule' => NULL,
  'lalala' => 'ti',
)

关于php - 必须插入varchar时如何将数组插入MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255643/

有关php - 必须插入varchar时如何将数组插入MySQL的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

随机推荐