【问题标题】:Why does this pdo::mysql code crash on windows?为什么这个 pdo::mysql 代码会在 Windows 上崩溃?
【发布时间】:2009-08-11 03:03:44
【问题描述】:

为什么这个 pdo::mysql 代码在 windows 上会崩溃???

<?php
$username = "root";
$password = "";

try {
    $dsn = "mysql:host=localhost;dbname=employees";
    $dbh = new PDO($dsn, $username, $password);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

echo "Connected to database<br />" ;

$dbh->exec("DROP TABLE IF EXISTS vCard;");
$dbh->exec("DROP TABLE IF EXISTS emp;");

$table = "CREATE TABLE vCard(
    id INT(4) NOT NULL PRIMARY KEY, 
    firstName VARCHAR (255), 
    lastName VARCHAR (255), 
    office VARCHAR (255), 
    homePh VARCHAR (13), 
    mobilePh VARCHAR (13))";

$dbh->exec($table);

$dbh->beginTransaction();

$dbh->exec("INSERT INTO vCard(id, firstName, lastName, office, homePh, mobilePh)
    VALUES (4834, 'Randy', 'Lewis', 'SR. Front End Developer', '631-842-3375', '917-435-2245');");

$dbh->exec("INSERT INTO vCard(id, firstName, lastName, office, homePh, mobilePh)    
    VALUES (0766, 'Frank', 'LaGuy', 'Graphic Designer', '631-789-8244', '917-324-9897');");

$dbh->exec("INSERT INTO vCard(id, firstName, lastName, office, homePh, mobilePh)    
    VALUES (6684, 'Donnie', 'Dolemite', 'COO', '631-789-9482', '917-234-1222');");

$dbh->exec("INSERT INTO vCard(id, firstName, lastName, office, homePh, mobilePh)    
    VALUES (8569, '', 'McLovin', 'Actor', '631-842-9786', '917-987-8944');");

$dbh->commit();

echo "Data entered successfully<br/><br/>";

    $sql = "SELECT * FROM vCard"; // WHERE firstName = 'Donnie'";

    $results = $dbh->query($sql);

    foreach ($results as $id){
        echo "SSN: ". $id['id']." ";
        echo "First Name: ". $id['firstName']." ";
        echo "Last Name: ". $id['lastName']."<br/>";
    }

}   
catch (PDOException $e) {
    echo "Failed: " . $e->getMessage();
    $dbh->rollback();
}   

?>

基本上这行代码是触发 Apache 崩溃的原因..

    $sql = "SELECT * FROM vCard"; 

如果我尝试选择一个值,例如“id”,它会...当我尝试选择多个值“*”时它会崩溃??????

【问题讨论】:

  • 你能发布错误信息吗?
  • 我运行它时它不会崩溃。
  • 我确定这不是 php ......这是别的东西,但什么???
  • 这对我来说也适用于选择,但我没有将其缩小到单列或多列
  • 你能发布错误信息吗?

标签: php mysql pdo


【解决方案1】:

我找到的独特解决方案:

从 5.0.51a 包安装 LibMySQL.DLL(使用最新的 5.1.44 MySQL 版本)

http://www.netfulvpc.fr/files/libmysql_dll.zip

【讨论】:

    【解决方案2】:

    好的,我有一个非常糟糕但可行的解决方案:p)

    使用十六进制编辑器打开 ext\php_pdo_mysql.dll

    搜索“83 C3 50”偏移量 0x000024d5(在 php 5.2.12 vc6 中)

    替换为 83 C3 "54"

    问题是结构大小不好...(struct pdo_column_data)

    我试图在 libmysql.dll 中修复该问题,但导致 php_mysqli 崩溃;)

    【讨论】:

    • ...3 个单独的答案,最后一个是直接编辑 DLL 本身?在接受这个之前,我会检查第二个意见。
    【解决方案3】:

    正确的方法是重新编译mysql mysqli 和pdo_mysql php 模块与良好的mysql 标头(来自mysql 源)

    但是设置好的开发环境很难(Windows SDK、VC6 命令行和所有需要的库)

    其实是有协议版本的(可以在mysql headers中看到一个名为version.h的文件)。

    我为我的 WAMP 包(名为 EWS - Easy Web Server)为每个新版本制作该包

    【讨论】:

      【解决方案4】:

      此处与 Apache2 PHP 5.2.12 / LibMySQL 5.1.44 和 5.1.42 相同... 使用 OllyDBG,我们可以看到崩溃发生在 php_pdo_mysql

      在第一列名称分析之后...我在堆栈中看到第一列“ID_Utilisateur”

      “ext\pdo_mysql\mysql_statement.c”附近

      LibMySQL 是不错的(php dir),这里都是VC6编译的...

      <?php
      
      $dbh = new PDO('mysql:host=127.0.0.1;port=3306;dbname=uba_dev','root','');
      
      echo "ok";
      $dbh->exec('SET CHARACTER SET latin1');
      
      echo "ok";
      $stmt = $dbh->query("select * from utilisateurs"); <<< CRASH HERE
      
      ...
      

      eip 002C249A 崩溃

      【讨论】:

      • [Sun Mar 14 19:47:37 2010 ] [notice] EACCELERATOR(81656):PHP 在 W:\web\pdo_test\index.php:7 的 query() 的 opline 16 上崩溃 [ Sun Mar 14 19:47:37 2010] [crit] 父级:子进程以状态 3 退出 - 正在中止。
      • 发生在 ext\pdo_mysql\ github.com/php/php-src/blob/… 中的 estrndup() 调用之前
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多