使用json_encode对数组进行编码时,包含特殊字符的数组元素将转换为空字符串:
$arr = array ( "funds" => "ComStage STOXX®Europe 600 Techn NR ETF", "time"=>....);
$json = json_encode($arr);
Run Code Online (Sandbox Code Playgroud)
在JSON编码之后,元素[funds]为空.它只发生在"ComStageSTOXX®Europe600Techn NR ETF"中的特殊字符(版权,商标等).
有什么建议?
谢谢
更新:这是在填充数组之前解决问题的方法(所有名称都来自数据库):
$mysqli->query("SET NAMES 'utf8'");
Run Code Online (Sandbox Code Playgroud) 我需要将大约200x50(rows,cols)的表值从jQuery发布到PHP.两种选择:
1)将其作为数组发送10,000个vars(增加php.ini max_input_vars).
2)将数组序列化为JSON字符串,将其作为字符串POST并在服务器端以PHP解码.
什么是优选的?选项1的任何潜在问题?
谢谢
PS.更新.在高达250x50单元的大型输入表上测试两个魔药后,看起来第一个选项要快得多:对于JSON字符串,1-2秒对比约17-20秒.
瓶颈是服务器的数据传输时间,因为对象到JSON和后退事务几乎是即时的(几毫秒).
循环代码中的经典事务:
$mysqli->query("START TRANSACTION");
foreach ($pdata as $key => $value) {
$sql = "INSERT INTO temp (`fund_id`) VALUES (" . $value . ")";
$result = $mysqli->query($sql);
}
$mysqli->query("COMMIT");
Run Code Online (Sandbox Code Playgroud)
然后我们改为准备好的陈述:
$mysqli->autocommit(FALSE);
foreach ($pdata as $key => $value) {
$sql = "INSERT INTO temp (`fund_id`) VALUES (?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $value);
$stmt->execute();
}
$mysqli->commit();
Run Code Online (Sandbox Code Playgroud)
问题:
1)这两个代码是否相同?我是否在准备好的陈述中遗漏了第二个代码中的内容?
2)是$mysqli->commit()一样的$mysqli->query("COMMIT")吗?
3)我是否需要$mysqli->query("START TRANSACTION");为准备好的语句块添加或者当我们设置时事务会自动启动autocommit(FALSE)?
是否可以将UNION第二个表的结果与第三个表连接起来?像这样的东西:
(SELECT DISTINCT `Fund_ID`, `Fund_Name` FROM `admin`
UNION
SELECT `Fund_ID`,`Fund_Name` FROM `admin_custom` WHERE `admin_custom`.`user_id` = 361) a
LEFT JOIN `qt1`
ON `qt1`.`Fund ID` = a.`Fund_ID`
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用.我之前可以移动JOIN每个SELECT查询UNION,但宁愿尝试JOIN使用UNION结果.
我怎样才能解决这个问题?
我有一个禁用按钮,在选中"我接受条款和条件"复选框后启用.问题是,如果用户单击禁用按钮,我想触发警报.我怎样才能做到这一点?如果某个元素被禁用,则看起来"onclick"事件不会被触发.
代码示例:
<input id="subm_tc" class="btn btn-primary" type="submit" disabled="" value="Log in" name="Submit">
$("#subm_tc").click(function () {
if($("#modlgn-tc").is(':checked')){
alert('checked');
} else {
alert('unchecked');
}
});
Run Code Online (Sandbox Code Playgroud)
如果我将该元素包装在div中并听取对该div的点击,则它可以正常工作,但您需要在按钮外单击.
我怎样才能解决这个问题?
谢谢
UPDATE.我设法通过在提交按钮上添加一个假div并在该div上侦听事件来解决这个问题(我还将z-index更改为-200以启用对按钮本身的点击):
<div style="position:relative">
<div id="subm_tc" style="position: absolute; left: 0px; right: 0px; bottom: 0px; top: 0px; z-index: 99999;"></div>
<input id="subm_tc" class="btn btn-primary" type="submit" disabled="" value="Log in" name="Submit">
</div>
Run Code Online (Sandbox Code Playgroud)
现在它按预期工作
我有来自我的代码的不同功能的50多个AJAX调用.所有这些调用都有类似的结构,具有不同的data/url/callback参数:
var jqXHR = $.post('/dba/port.php', {
mode: "del_wallfunds",
pdata: cdata,
wname: wName
},
function (data) {}, "json")
.done(function (data) {
var msg = data.msg;
if (msg.indexOf("Error") == -1) {
alertify.success(msg);
delSelected(selGroup);
} else {
alertify.error(msg);
}
})
.fail(function () {
alertify.error("Error .....");
});
Run Code Online (Sandbox Code Playgroud)
我在想如何编写一个函数来返回var jqXHR以最小化代码的总大小.传递所有静态变量(如URL,错误字符串等)不是问题.但问题是".done"上的所有回调函数都不同,我不知道如何将这些回调函数作为变量传递.
一种方法是在.done上调用单个"通用"函数并将"switch"变量传递给该函数,但它似乎不是一个优雅的解决方案.
有什么建议如何以优雅的方式?
谢谢
抱歉这是一个太简单的问题,但很长一段时间我找不到答案.我使用此jQuery代码将Chrome中的iFrame保存为pdf:
$("#ifr").get(0).contentWindow.print();
Run Code Online (Sandbox Code Playgroud)
一切都很好,但Chrome总是采用Letter格式输出.我需要增加纸张尺寸或定义自定义纸张尺寸.
有许多参考资料表明Chrome应该从 Win 7中的默认打印机中获取纸张大小.但更改默认打印机打印选项(纸张大小,布局等)不会影响Chrome打印 - 无论默认情况如何,它都会采用Letter格式打印机设置.
Chrome从哪里获取打印页面大小设置?我该怎么改变它?
谢谢
我在热图上遇到点击事件有问题:只有在点击工具提示时才有效,但在图表本身上却没有.查看演示http://jsfiddle.net/3UWaA/1/
chart: {
type: 'heatmap',
events: {
click: function(event) {
alert("clicked!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何建议如何解决这个问题?
谢谢
看看这段代码:
$first = DateTime::createFromFormat('Y-m', '2001-07');
$last = DateTime::createFromFormat('Y-m', '1998-06');
$interval = $first->diff($last);
echo "m diff: ".$interval->m." y diff: ".$interval->y."\n";
Run Code Online (Sandbox Code Playgroud)
输出为m diff:0 y diff:3
为什么它会返回错误的月份差异?
有趣的是,如果我将日期更改为"2001-08"和"1998-07",则会返回正确的月份间隔== 1.
谢谢!
字符串的日期转换返回第2个月(2月)的错误值:
$dtformat = 'Y-m-01';
$curDate = DateTime::createFromFormat('Y-m', '1996-02');
print_r($curDate);
$dt = $curDate->format($dtformat);
echo $dt."\n";
Run Code Online (Sandbox Code Playgroud)
而不是"1996-02-01",它返回"1996-03-01".这是$currDate数组:
DateTime Object (
[date] => 1996-03-02 01:19:01
[timezone_type] => 3
[timezone] => America/New_York
)
Run Code Online (Sandbox Code Playgroud)
所有其他月份工作正常.我在这里错过了什么?
谢谢!
我有"Ym"格式的日期字符串.这一天与此无关.现在我需要从这些日期字符串创建另一个日期,这一天应该是该月的第一天或最后一天.我试过这段代码:
$curDate = DateTime::createFromFormat('Y-m', $datestring1);
$dt = $curDate->format('Y-m-d');
Run Code Online (Sandbox Code Playgroud)
这里的问题是它创建了当月的日期.如何强制它在第1天或最后一天进行?
谢谢
这可能是一个非常基本的问题 - 请参阅一个简单的代码:
var ar1=[];
var ar2=[];
ar1[0] = 'Constant';
ar1[1] = data.attr.const;
ar2.push(ar1); //OK, ar2 contains one array of two correct elements
ar1[0] = 'R-squared';
ar1[1] = data.attr.rsq;
ar2.push(ar1); // Not OK - ar2 contains 2 identical arrays
ar1[0] = 'R-sq. adjusted';
ar1[1] = data.attr.rsqadj;
ar2.push(ar1); // Not OK - ar2 contains 3 identical arrays
Run Code Online (Sandbox Code Playgroud)
问题是每次执行ar2.push(ar1)时,它都会覆盖ar2的所有元素.执行此代码后,我得到一个包含3个相同数组的对象.我该如何解决?
谢谢
php ×6
javascript ×4
jquery ×3
mysql ×2
ajax ×1
arrays ×1
highcharts ×1
join ×1
json ×1
mysqli ×1
post ×1
sql ×1
transactions ×1
union ×1