Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么只执行第一次选择?_Php_Mysql_Mysqli - Fatal编程技术网

Php 为什么只执行第一次选择?

Php 为什么只执行第一次选择?,php,mysql,mysqli,Php,Mysql,Mysqli,我正在为一些表使用一个简单的MySQLi函数SELECT | INSERT | UPDATE,但我无法让它工作。这是函数的代码: function syncReps($fileName, $server, $user, $pass, $db) { $conn = new mysqli($server, $user, $pass, $db); if ($conn->connect_error) { trigger_error('Database connec

我正在为一些表使用一个简单的MySQLi函数
SELECT | INSERT | UPDATE
,但我无法让它工作。这是函数的代码:

function syncReps($fileName, $server, $user, $pass, $db)
{
    $conn = new mysqli($server, $user, $pass, $db);

    if ($conn->connect_error) {
        trigger_error('Database connection failed: '.$conn->connect_error, E_USER_ERROR);
    }

    $data = convertCsvToArray($fileName);
    echo "DEBUG count(data): ", count($data), "\n";

    // Processing on each row of data
    foreach ($data as $row) {
        $sql = 'SELECT id,lastSyncAt FROM reps WHERE veeva_rep_id = '.$row['Id'];
        echo "DEBUG: ", $sql, "\n";
        $rs = $conn->query($sql);

        if ($rs === false) {
            trigger_error('Wrong SQL: '.$sql.' Error: '.$conn->error, E_USER_ERROR);
        } else {
            $rows_returned = $rs->num_rows;
            $veeva_rep_id = "'".$conn->real_escape_string($row['Id'])."'";
            $first = "'".$conn->real_escape_string(ucfirst(strtolower($row['FirstName'])))."'";
            $last = "'".$conn->real_escape_string(ucfirst(strtolower($row['LastName'])))."'";
            $email = "'".$conn->real_escape_string($row['Email'])."'";
            $username = "'".$conn->real_escape_string($row['Username'])."'";
            $display_name = "'".$conn->real_escape_string(
                    ucfirst(strtolower($row['FirstName'])).' '.ucfirst(strtolower($row['LastName']))
                )."'";

            if ($rows_returned === 0) {
                $sql = "INSERT INTO reps(veeva_rep_id,first,last,email,username,lastLoginAt,lastSyncAt,display_name,rep_type,avatar_url) VALUES($veeva_rep_id,$first,$last,$email,$username,NOW(),NOW(),$display_name,'VEEVA','default_avatar.png')";
                echo "DEBUG: ", $sql, "\n";
                $conn->query($sql);
            } else {

            }
        }
    }
}
当我以
php script.php
的形式从CLI执行脚本时,我得到了以下结果:

DEBUG count(data): 1454
DEBUG: SELECT id,lastSyncAt FROM reps WHERE veeva_rep_id = 00580000008ReolAAC
它首先停止
SELECT
query,为什么?如果
$data
计数为1454,则不应执行相同的
选择
插入
如果
$num_rows==0
?我错过了什么

编辑

我的另一个功能仍存在类似问题,请参见下文:

function syncTerritories($fileName, $server, $user, $pass, $db)
{
    $conn = new mysqli($server, $user, $pass, $db);

    if ($conn->connect_error) {
        trigger_error('Database connection failed: '.$conn->connect_error, E_USER_ERROR);
    }

    $data = convertCsvToArray($fileName);
    echo "DEBUG count(data): ", count($data), "\n";

    // Processing on each row of data
    foreach ($data as $row) {
        $sql = "SELECT id FROM territories WHERE veeva_territory_id='{$row['Id']}'";
        echo "DEBUG: ", $sql, "\n";
        $rs = $conn->query($sql);

        if ($rs === false) {
            echo 'Wrong SQL: '.$sql.' Error: '.$conn->error, E_USER_ERROR;
        } else {
            $rows_returned = $rs->num_rows;

            $veeva_territory_id = "'".$conn->real_escape_string($row['Id'])."'";
            $name = "'".$conn->real_escape_string($row['Name'])."'";

            if ($rows_returned === 0) {
                $sql = "INSERT INTO territories(veeva_territory_id,territory_name,createdAt,updatedAt) VALUES($veeva_territory_id,$name,NOW(),NOW())";
                echo "DEBUG: ", $sql, "\n";
                $rs = $conn->query($sql);

                if ($rs === false) {
                    echo 'Wrong SQL: '.$sql.' Error: '.$conn->error, E_USER_ERROR;
                }

                $rs->free();
            } else {
                // UPDATE
            }
        }
    }
}
输出如下:

DEBUG count(data): 6911
DEBUG: SELECT id FROM territories WHERE veeva_territory_id='04T800000008zy9EAA'
DEBUG: SELECT id FROM territories WHERE veeva_territory_id='04T80000000903eEAA'
DEBUG: SELECT id FROM territories WHERE veeva_territory_id='04T80000000TOTIEA4'
DEBUG: INSERT INTO territories(veeva_territory_id,territory_name,createdAt,updatedAt) VALUES('04T80000000TOTIEA4','AKORN_101TM',NOW(),NOW())

现在怎么了?从这种方式到准备好的陈述应该是好的吗?如果有的话,可以给我一些基于我的查询作为例子吗?

这是一个无效的SQL字符串。您需要将
veeva_rep_id
值用单引号括起来:

$sql = "SELECT id,lastSyncAt FROM reps WHERE veeva_rep_id='{$row['Id']}'";

veeva_rep_id是一个字符串,因此select wuerryI QUOTE
trigger_error
中需要引号。SQL查询似乎会失败,因为缺少id的引号。只需使用
$SQL=“select id,lastSyncAt FROM reps WHERE veeva_rep_id='$row[id]”即可
或double并保存疯狂的报价你能看看我的编辑吗?我不知道出了什么问题,我重新检查了几次代码,你能给我一些建议吗?再一次。。。。