小编Ric*_*shi的帖子

我的PHP数组引用"神奇地"成为一个值数组...为什么?

我正在围绕mysqli创建一个包装函数,这样我的应用程序就不必过于复杂了数据库处理代码.部分原因是使用mysqli :: bind_param()参数化SQL调用的一些代码.你可能知道bind_param()需要引用.因为它是一个半通用的包装器,所以我最终打了这个电话:

call_user_func_array(array($stmt, 'bind_param'), $this->bindArgs);
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given
Run Code Online (Sandbox Code Playgroud)

上面的讨论是为了那些会说"你的例子中根本不需要引用"的人.

我的"真实"代码比任何人想读的都复杂一点,所以我把导致这个错误的代码煮成了以下(希望)说明性示例:

class myclass {
  private $myarray = array();

  function setArray($vals) {
    foreach ($vals as $key => &$value) {
      $this->myarray[] =& $value;
    }
    $this->dumpArray();
  }
  function dumpArray() {
    var_dump($this->myarray);
  }
}

function myfunc($vals) {
  $obj = new myclass;
  $obj->setArray($vals);
  $obj->dumpArray();
}

myfunc(array('key1' => 'val1',
             'key2' => 'val2'));
Run Code Online (Sandbox Code Playgroud)

问题似乎是,在myfunc()中,在调用setArray()和调用dumpArray()之间,$ obj-> myarray中的所有元素都不再是引用而是变为值.通过查看输出可以很容易地看出这一点:

array(2) {
  [0]=>
  &string(4) "val1"
  [1]=>
  &string(4) "val2"
}
array(2) {
  [0]=> …
Run Code Online (Sandbox Code Playgroud)

php arrays mysqli reference object

11
推荐指数
1
解决办法
3105
查看次数

用PHP编写的SSI解析器?

好吧,这可能听起来有点疯狂,但在这里忍受我一分钟.

我正在开发一个标准是使用SSI来包含页眉,页脚和菜单的网站.包含的文件使用SSI条件来处理不同的浏览器,一些#include嵌套,以及一些#set/#if技巧来突出显示菜单中的当前页面.换句话说,它不仅仅是SSI中的#include指令.

我确信有些人可能会对美学产生争论,但对于静态HTML来说,它确实很有效.

现在,问题是:我想从我的PHP脚本中"#include"相同的SSI解析的页眉和页脚html文件,从而避免代码重复并仍然保持网站的统一外观.如果PHP在通常的mod_php环境中运行,我可以通过使用PHP的virtual()函数来做到这一点.不幸的是,该站点使用FastCGI/suexec来运行PHP(这样每个VirtualHost可以作为不同的用户运行),这会破坏virtual().

我一直在使用我在PHP中编写的一个相当简单的SSI解析器(它处理#includes,以及一些非常简单的#if语句),但我想要一个更通用的解决方案.所以,在我开始编写一些可能有问题,更完整的SSI解析器之前,有没有人知道用PHP编写的完整SSI解析器?当然,我也对在我所概述的限制下工作的其他解决方案持开放态度.

非常感谢你的时间.

php apache ssi

6
推荐指数
1
解决办法
638
查看次数

VFS:达到文件最大限制1231582

我正在运行Linux 2.6.36内核,我看到一些随机错误.像

ls: error while loading shared libraries: libpthread.so.0: cannot open shared object file: Error 23
Run Code Online (Sandbox Code Playgroud)

是的,我的系统无法始终运行'ls'命令.:(

我注意到我的dmesg输出中有几个错误:

# dmesg | tail
[2808967.543203] EXT4-fs (sda3): re-mounted. Opts: (null)
[2837776.220605] xv[14450] general protection ip:7f20c20c6ac6 sp:7fff3641b368 error:0 in libpng14.so.14.4.0[7f20c20a9000+29000]
[4931344.685302] EXT4-fs (md16): re-mounted. Opts: (null)
[4982666.631444] VFS: file-max limit 1231582 reached
[4982666.764240] VFS: file-max limit 1231582 reached
[4982767.360574] VFS: file-max limit 1231582 reached
[4982901.904628] VFS: file-max limit 1231582 reached
[4982964.930556] VFS: file-max limit 1231582 reached
[4982966.352170] VFS: file-max limit 1231582 reached
[4982966.649195] …
Run Code Online (Sandbox Code Playgroud)

linux filesystems vfs linux-kernel

5
推荐指数
1
解决办法
2万
查看次数

是否可以在PHP中引用匿名数组的特定元素?

这可能是一个简单的问题,我担心答案可能是"不",但......

这是一段简单的代码:

function func1() {
  $bt = debug_backtrace();
  print "Previous function was " . $bt[1]['function'] . "\n";
}
Run Code Online (Sandbox Code Playgroud)

现在......这可以在没有临时变量的情况下完成吗?在另一种语言中,我可能会说:

function func1() {
  print "Previous function was " . (debug_backtrace())[1]['function'] . "\n";
}
Run Code Online (Sandbox Code Playgroud)

唉,在PHP中,这会导致错误:

PHP Parse error:  syntax error, unexpected '[' ...
Run Code Online (Sandbox Code Playgroud)

如果无法完成,则无法完成,我将使用临时变量,但我不愿意.

php arrays indexing anonymous

5
推荐指数
1
解决办法
1059
查看次数

如何在 SQL Server 中跟踪数据库写入?

我正在使用 SQL Server 2008 R2,试图对一个不透明的应用程序进行逆向工程并复制它的一些操作,以便我可以自动加载一些海量数据。

我认为这应该很容易——只需进入 SQL Server Profiler,开始跟踪,执行 GUI 操作,然后查看跟踪结果。我的问题是过滤器没有像我预期的那样工作。特别是,“Writes”列经常显示“0”,即使在明显对数据库进行更改的语句(例如INSERT查询)上也是如此。这使得无法Writes >= 1像我想要的那样设置过滤器。

我已经通过设置全包跟踪并运行应用程序来验证这正是正在发生的事情。我事先查了表,运行了操作,后来查了表,肯定是对表做了改动。我查看了跟踪,在“写入”列中没有一行显示任何非零数字,包括显示INSERT查询的行。查询没什么特别的......就像

exec sp_executesql 
    N'INSERT INTO my_table([a], [b], [c]) 
      values(@newA, @newB, @newC)',
    N'@newA int,@newB int,@newC int', @newA=1, @newB=2, @newC=3
Run Code Online (Sandbox Code Playgroud)

(如果上面有错误,这里是我的错字——该语句肯定是在表中插入了一条记录)

我确信这种行为的关键在于“写入”列的描述:“服务器代表事件执行的物理磁盘写入次数。” 也许服务器正在缓存写入,并且它发生在 Profiler 的权限之外。我不知道,也许这并不重要。

有没有办法可靠地查找和记录更改数据库的所有语句?

sql-server profiler

5
推荐指数
1
解决办法
2832
查看次数

我使用ODBC从PHP获取"字符串数据,右截断"错误并连接到Microsoft SQL Server 2008R2实例

我在CentOS 6.2盒子上使用PHP 5.3.3,连接到Microsoft SQL Server 2008R2的一个实例.连接有效,只要我的查询不包含参数,我就可以检索数据.当我添加参数时,我得到错误,"字符串数据,右截断".

这是一些示例代码:

<?php

$dbh = new PDO("odbc:myDSN", 'myUsername', 'myPassword');

$testCase = 1;
switch ($testCase) {
case 1:
  //  This case fails with this error:
  //    Error 22001: [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation (SQLExecute[0] at /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)
  $query = "select * from [myDatabase].[sys].[objects] WHERE (([name]=?))";
  $stmt = $dbh->prepare($query);
  $param1 = 'testtable1';
  $stmt->bindParam(1, $param1, PDO::PARAM_STR);   //  Note:  '1' is correct; it should not be '0'
  break;
case 2:
  //  This case works properly
  $query …
Run Code Online (Sandbox Code Playgroud)

php odbc sql-server-2008

4
推荐指数
1
解决办法
2476
查看次数