Php 为什么只执行第一次选择?
我正在为一些表使用一个简单的MySQLi函数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
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 QUOTEtrigger_error
中需要引号。SQL查询似乎会失败,因为缺少id的引号。只需使用$SQL=“select id,lastSyncAt FROM reps WHERE veeva_rep_id='$row[id]”即可
或double并保存疯狂的报价你能看看我的编辑吗?我不知道出了什么问题,我重新检查了几次代码,你能给我一些建议吗?再一次。。。。