PHP PDO-不在循环中插入所有语句

PHP PDO-不在循环中插入所有语句,php,loops,pdo,percona,handlersocket,Php,Loops,Pdo,Percona,Handlersocket,让我们想象一下我们应该使用PDO在循环中插入很多行的情况 $sql=“插入产品(名称、价格)值(:名称、价格)”; $stmt=$db->prepare($sql); 对于($i=0;$ibindParam(':name',$name); $stmt->bindParam(':price',$price); 尝试 { $result=$stmt->execute(); 如果(!$result) { 打印($db->errorInfo()); } echo$db->lastInsertId();

让我们想象一下我们应该使用PDO在循环中插入很多行的情况

$sql=“插入产品(名称、价格)值(:名称、价格)”;
$stmt=$db->prepare($sql);
对于($i=0;$i<100;$i++)
{
$name=md5(兰特(0,1000));
$price=兰特(0,1000);
$stmt->bindParam(':name',$name);
$stmt->bindParam(':price',$price);
尝试
{
$result=$stmt->execute();
如果(!$result)
{
打印($db->errorInfo());
}
echo$db->lastInsertId();
}
捕获(例外$e)
{
echo$e->getMessage();
}
}
这样,所有100行都不会插入到数据库中。第23行的echo将输出如下内容:

12345。。。59 60 61 61

并输出第20行的打印

 Array (
     [0] => 00000
     [1] => 
     [2] =>  
 )
PDO错误代码00000表示一切正常。没有行受到影响。若我试图手动插入$result为false的行,那个么一切都可以

并且只有61行将插入到表中。每次脚本运行时,这个数字都在变化,这真的很奇怪

为什么?

换句话说,我们可以从所有insert查询中进行一个查询,并且将插入所有100行。下面是一个带有代码的粘贴箱

下面是一个表结构:

创建表(如果不存在)`products`(
`id`int(10)非空自动增量,
`name`varchar(255)不为空,
`price`int(10)不为空,
主键(`id`)
)ENGINE=InnoDB默认字符集=utf8;
顺便说一句。我使用percona MySQL服务器(5.5)和HandlerSocker插件。 我试着用HandlerSocket插入行。这是一个密码

$hs=new\hsppp\WriteSocket();
$hs->connect();
$id=$hs->getIndexId('test','products','name,price');
$loops_number=10000;
对于($i=0;$i<$loops\u number;$i++)
{
$name='handler-'.md5(兰特(011000));
$price=兰特(0,1000);
$hs->insert($id,array($name,$price));
}
在这之后,我有大约14000行的DB。为什么?此外,如果我更改循环数(变量$loops\u number)-


我的MySQL服务器似乎有问题?

哇!!!这是很多关于兄弟的信息。我不确定我是否正确回答了您的问题,但如果我正确回答了,那么下面的代码将更好地实现相同的效果:

$name = md5(rand(0, 1000));
$price = rand(0, 1000);

try{

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    for($i=0, $i<100, $i++){

        $sql = "INSERT INTO products (name, price) VALUES (:name, :price)";
        $stmt = $db->prepare($sql);
        $stmt->execute(array(':name'=>$name[$i], ':price'=>$price[$i]));

        echo $db->lastInsertId();

    }

}catch(PDOException $e){


    print_r($db->errorInfo());

    echo 'An error occured'.$e->getMessage();

} 
$name=md5(兰特(011000));
$price=兰特(0,1000);
试一试{
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
对于($i=0,$iprepare($sql);
$stmt->execute(数组(':name'=>$name[$i],':price'=>$price[$i]);
echo$db->lastInsertId();
}
}捕获(PDO$e){
打印($db->errorInfo());
echo“发生错误”。$e->getMessage();
} 

试试看,告诉我你得到了什么。

我通过重新安装PHP解决了这个问题。(我从这个repo使用了PHP:
ppa:ondrej/php5

和手柄插座插入问题: 1.在循环内创建索引
2.如果您通过HandlerSocket进行插入查询,则最好手动设置id(自动递增)

重复61的原因可能有很多。这将有助于发布您的实际代码。不是这样,对吗?您只需在循环之前准备一次语句。无需准备100次:)你的意思是它总是停留在61?而且我相信如果你捕捉到PDO异常,你可以通过errorInfo获得关于错误的更具体信息…关于在循环外准备-我知道,但这不会解决问题。失败时,我得到以下信息:
数组([0]=>00000[1]=>[2]=>)发生错误QLSTATE[HY000]:常规错误:2013在查询过程中与MySQL服务器失去连接
btw。如果我运行脚本表单浏览器-则为失败。如果窗体控制台-一切正常。我想nginx+php-fpm的问题是所有必要的还是一个项目要求?不。我只是玩了percona mysql服务器,发现这是可行的。所以我想解决这个问题,并回答“为什么会这样”的问题:)如果你的脚本运行良好,请竖起大拇指。但是,你也应该考虑其他的做事方式,他们可能会得到同样的结果,但不那么繁琐和高效。这就是编程之美;)
$name = md5(rand(0, 1000));
$price = rand(0, 1000);

try{

    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    for($i=0, $i<100, $i++){

        $sql = "INSERT INTO products (name, price) VALUES (:name, :price)";
        $stmt = $db->prepare($sql);
        $stmt->execute(array(':name'=>$name[$i], ':price'=>$price[$i]));

        echo $db->lastInsertId();

    }

}catch(PDOException $e){


    print_r($db->errorInfo());

    echo 'An error occured'.$e->getMessage();

}